【发布时间】:2016-03-30 14:00:26
【问题描述】:
C# 6 中最方便的新功能之一是nameof,它允许程序员有效地消除对magic strings 的使用。
根据文档,nameof 返回一个字符串:
用于获取变量、类型或成员的简单(非限定)字符串名称。
在以下代码示例中显式输入效果很好:
string magicString = nameof(magicString);
但是,当使用 var keyword 的隐式类型时:
var magicString = nameof(magicString);
编译器抛出错误:
在声明之前不能使用局部变量“magicString”
然后我对 Visual Studio 中可用的 C# 交互窗口进行了更多试验。同样,第一个示例运行良好,但第二个示例这次抛出了不同的错误:
错误 CS7019:无法推断“magicString”的类型,因为它的初始化程序直接或间接引用了定义。
nameof 表达式明明返回的是字符串,那为什么编译器在与初始化变量一起使用时不能隐式键入呢?
【问题讨论】:
-
老实说,从语义上讲,
string magicString = nameof(magicString)有效的事实比var magicString = nameof(magicString)无效的事实更让我困扰 -
因为编译器会先用
default(T)初始化变量,然后赋值nameof()的结果。 -
语言团队认为这不值得规范复杂性。 github.com/dotnet/roslyn/issues/766
-
@AlfieGoodacre:
var不是这样工作的。 -
@SLaks:您应该将其发布为答案,因为它是一个。另请参阅链接问题 (#7031)。