Как использовать функцию C # 6 «Использование статики»?

123

Я рассматриваю несколько новых функций C # 6, в частности, «использование статики» .

using static - это новый вид предложения using, который позволяет импортировать статические члены типов непосредственно в область видимости.
(Внизу сообщения в блоге)

Идея заключается в следующем, согласно паре найденных мной руководств,
вместо:

using System;

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

Вы можете опустить повторяющийся Consoleоператор, используя новую функцию C # 6 использования статических классов:

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

Однако, похоже, это не работает для меня. Я получаю сообщение об ошибке в usingзаявлении:

using namespaceДиректива "A" может применяться только к пространствам имен; " Console" - это тип, а не пространство имен. using staticВместо этого рассмотрите директиву " " "

Я использую Visual Studio 2015, и у меня установлена ​​версия языка сборки «C # 6.0».

Что дает? Пример блога msdn неверен? Почему это не работает?


Сообщение в блоге теперь обновлено, чтобы отразить последние обновления, но вот скриншот на случай, если блог выйдет из строя:

блог

Cerbrus
источник

Ответы:

177

Похоже, синтаксис немного изменился с тех пор, как были написаны эти сообщения в блоге. Как следует из сообщения об ошибке, добавьте staticв свой оператор include:

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

Затем ваш код будет скомпилирован.


Обратите внимание, что в C # 6.0 это будет работать только для членов, объявленных как static.

Например, рассмотрите System.Math:

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

Когда using static System.Math, можно просто использовать Abs();.
Тем не менее, вы все равно придется префиксом , PIпоскольку он не является членом статичным: Math.PI;.

Начиная с C # версии 7.2, этого не должно быть, можно использовать constтакие значения, как PI.

Cerbrus
источник
3
У меня аналогичная проблема, но вместо этого System.Math, в частности Math.PI. Когда я использую using static System.Math, такие методы Sqrt()работают, но не постоянные PI. Мне нужно продолжить писать, Math.PIиначе код не компилируется. Мне любопытно, почему это не работает. Следует ли мне задать для этого новый вопрос?
skwear
5
@skwear: это похоже на материал для нового вопроса, да.
Cerbrus
1
В качестве быстрого ответа на вопрос @ skwear: «использование static - это новый вид предложения using, позволяющий импортировать статические члены <...>» . PIне является статическим членом Mathкласса. Это константа. Проще говоря: член должен быть объявлен как static.
Cerbrus
3
Звучит как возможность для нового синтаксиса: using const System.Math;:)
Филип Скакун
1
Пример в документации Microsoft утверждает, что PI можно использовать без префикса: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Guney Ozsan,
1

staticКлючевое слово в usingотчете будет импортировать только один, указанный тип (и это вложенные типы). Кроме того, вы больше не должны указывать имя типа. Так что просто добавьте статику к своему использованию.

Примечание. Используйте эту функцию только в том случае, если два класса логически тесно связаны, иначе чтение кода будет затруднено.

Тобиас Брол
источник
"вы не должны давать имя типа" Что вы имеете в виду? Где я это сделал?
Cerbrus
Тобиас, я нигде не совмещаю.
Cerbrus
@Cerbrus О, контекст слова «как ты сделал» случайно изменился, это исправит
Тобиас Брол