C# 你的工作职责是什么?
我只是想知道为什么C#6中的nameof可以访问非静态属性,就像它是静态的一样。这里有一个例子C# 你的工作职责是什么?,c#,c#-6.0,C#,C# 6.0,我只是想知道为什么C#6中的nameof可以访问非静态属性,就像它是静态的一样。这里有一个例子 public class TestClass { public string Name { get; set; } } public class Test { public Test() { string name = nameof(TestClass.Name); // whats so speciall about nameof //str
public class TestClass
{
public string Name { get; set; }
}
public class Test
{
public Test()
{
string name = nameof(TestClass.Name); // whats so speciall about nameof
//string name2 = TestClass.Name; this won't compile obviously,
}
}
它不是“访问”属性——该操作符纯粹是一种将参数的“名称”注入代码的编译器机制。在这种情况下,它将用
“Name”
替换nameof(TestClass.Name)
。它是非静态的这一事实与此无关 nameof
解释器在compiletime
解析并转换为静态字符串。
在您的例子中,nameof(TestClass.Name)
您将只返回“Name”
作为字符串。
您必须使用nameof(TestClass)
使用nameof
可以最大限度地减少代码中的冗余(例如:不必使用nameof
为propertyname或类似的内容定义字符串)
您也可以使用它来表示类名称。但是请注意!nameof(MyClass)
如果您有派生类,则可能与运行时不同!
出于运行时目的,请改用typeOf
或.GetType()
在上阅读更多内容它没有什么特别之处。这在编译时发生,而不是在运行时。编译器将名为Name的成员转换为字符串文字“Name”没有任何问题。唯一奇怪的是,为什么它需要6个版本才能添加到语言中:)你说的“Name的
如何工作?”为什么它不起作用?您是否有类似的问题,例如、开关
、返回等。?这些是怎么工作的?编写编译器是为了理解它们,并在看到它们时生成正确的编译代码。您是否在寻找编译器工作原理的解释?然后,“太宽了”。如果不是,那么我真的不明白你在问什么。请解释到底是什么让你困惑。你可以在这里找到答案:@HansPassant告诉我们可怜的爪哇人。我很高兴它在这里,至少现在在这里;)“它将用“TestClass.Name”
替换nameof(TestClass.Name)
“不,它将仅用“Name”
替换它。此外,nameof
无法访问私有成员,您的代码工作不正常,它失败:“CS0122'A.Y'由于其保护级别而无法访问”嗯,这是可行的,但我把那部分删掉了,因为它与问题无关。我认为这是mono C#编译器中的一个bug,所以我有。