Como faço para usar o recurso C # 6 “Usando estática”?

123

Estou dando uma olhada em alguns dos novos recursos no C # 6, especificamente, "usando estática" .

using static é um novo tipo de cláusula using que permite importar membros estáticos de tipos diretamente para o escopo.
(Parte inferior da postagem do blog)

A ideia é a seguinte, de acordo com alguns tutoriais que encontrei, em
vez de:

using System;

class Program 
{ 
    static void Main() 
    { 
        Console.WriteLine("Hello world!"); 
        Console.WriteLine("Another message"); 
    } 
}

Você pode omitir a Consoleinstrução repetida , usando o novo recurso C # 6 de usar classes estáticas:

using System.Console;
//           ^ `.Console` added.
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } // ^ `Console.` removed.
}

No entanto, isso não parece estar funcionando para mim. Estou recebendo um erro na usingdeclaração, dizendo:

"Uma using namespacediretiva ' ' só pode ser aplicada a namespaces; ' Console' é um tipo, não um namespace. Considere uma using staticdiretiva ' ' em vez disso"

Estou usando o Visual Studio 2015 e tenho a versão da linguagem de compilação definida como "C # 6.0"

O que da? O exemplo do blog do msdn está incorreto? Por que isso não funciona?


A postagem do blog agora foi atualizada para refletir as atualizações mais recentes, mas aqui está uma captura de tela, caso o blog caia:

blog

Cerbrus
fonte

Respostas:

177

Parece que a sintaxe mudou ligeiramente desde que essas postagens de blog foram escritas. Como a mensagem de erro sugere, adicione staticà sua declaração de inclusão:

using static System.Console;
//      ^
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } 
}

Então, seu código será compilado.


Observe que, no C # 6.0, isso funcionará apenas para membros declarados como static.

Por exemplo, considere System.Math:

public static class Math {
    public const double PI = 3.1415926535897931;
    public static double Abs(double value);
    // <more stuff>
}

Quando using static System.Math, você pode apenas usar Abs();.
No entanto, você ainda tem que prefixo PIporque não é um membro estático: Math.PI;.

A partir do C # versão 7.2, esse não deveria ser o caso, constvalores como também PIpodem ser usados.

Cerbrus
fonte
3
Estou tendo um problema semelhante, mas em vez disso System.Math, especificamente Math.PI. Quando eu uso using static System.Math, os métodos gostam de Sqrt()funcionar, mas não uma constante PI. Tenho que continuar escrevendo Math.PIou o código não compila. Estou curioso para saber por que isso não funciona. Devo enviar uma nova pergunta para isso?
skwear
5
@skwear: isso soa como material para uma nova pergunta, sim.
Cerbrus
1
Como uma resposta rápida à pergunta de @ skwear: "usar estático é um novo tipo de cláusula de uso que permite importar membros estáticos <...>" . PInão é um membro estático da Mathclasse. É uma constante. Simplificando: o membro deve ser declarado como static.
Cerbrus,
3
Parece uma oportunidade para uma nova sintaxe como: using const System.Math;:)
Filip Skakun
1
O exemplo na documentação da Microsoft afirma que o PI pode ser usado sem prefixo: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Guney Ozsan
1

A staticpalavra-chave em uma usinginstrução importará apenas aquele tipo especificado (e seus tipos aninhados). Além disso, você não deve mais fornecer o nome do tipo. Portanto, basta adicionar estática ao seu uso.

Nota: Use este recurso apenas quando as duas classes estiverem logicamente relacionadas, caso contrário, torna a leitura do código muito difícil.

Tobias Brohl
fonte
"você não deve dar o nome do tipo" O que você quer dizer com isso? Onde eu fiz isso?
Cerbrus
Thobias, não estou combinando os dois em lugar nenhum.
Cerbrus
@Cerbrus Oh, o contexto de 'como você fez' mudou acidentalmente, vai consertar isso
Tobias Brohl