如何使用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伪指令只能应用于名称空间;伪指令Console是类型,而不是命名空间。请考虑使用using static伪指令”

我正在使用Visual Studio 2015,并且将构建语言版本设置为“ C#6.0”

是什么赋予了?msdn博客的示例不正确吗?为什么不起作用?


博客文章现已更新,以反映最新更新,但以下是截屏以防博客崩溃的屏幕截图:

博客

Answers:


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


3
我遇到类似的问题,但System.Math具体来说是Math.PI。当我使用时using static System.Math,方法像Sqrt()工作,但不是常数PI。我必须继续写,Math.PI否则代码无法编译。我很好奇为什么这行不通。我应该为此提出一个新问题吗?
skwear

5
@skwear:听起来像是一个新问题的素材,是的。
Cerbrus

1
作为@skwear问题的快速解答:“使用静态是一种新型的using子句,可让您导入静态成员<...>”PI不是该类的静态成员Math。这是一个常数。简而言之:成员必须声明为static
Cerbrus

3
听起来像是使用新语法的机会:using const System.Math;:)
Filip Skakun

1
在Microsoft文档权利要求PI的例子可以在没有前缀使用:docs.microsoft.com/en-us/dotnet/csharp/language-reference/...
居内伊Ozsan

1

语句中的static关键字using将仅导入一种指定的类型(及其嵌套类型)。此外,您不能再给出类型名称。因此,只需将static添加到您的使用中即可。

注意:仅当两个类在逻辑上紧密相关时,才应使用此功能,否则会使阅读代码非常困难。


“您不能输入类型名称”是什么意思?我在哪做的
Cerbrus

托比亚斯,我不会在任何地方将两者结合在一起。
Cerbrus

@Cerbrus哦,“如您所愿”的上下文意外更改,将解决此问题
Tobias Brohl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.