从this question我了解到,在C#6.0中引入的nameof()
运算符不能用于同义词。因此,您可以撰写nameof(System.Object)
,但不能nameof(object)
。
现在,还有其他两个类似的运算符typeof()
和default()
,它们完全可以在同义词上运行。你可以写:
default(object);
default(int);
typeof(string);
typeof(long);
以及:
default(Object);
default(Int32);
typeof(String);
typeof(Int64);
,结果是一样的。
我想我可以构建nameof()
运算符来使用同义词。
所以问题是:为什么没有实现它与object
,string
,int
等一起使用?我猜错了(即它不可能实现)?或者它是设计的选择?
答案 0 :(得分:4)
我认为这是设计的选择。
typeof()
运算符返回Type
。由于object
和System.Object
表达完全相同的Type
,因此编写typeof(object)
时没有问题。
同样适用于default()
:在两种情况下都是null
(或0
或其他)。
现在,对于nameof()
,上下文有点困难。
假装允许nameof(object)
。它应该返回什么?
"object"
。但现在结果与nameof(System.Object)
不同,因为类是相同的,所以没有任何意义。"Object"
大写,与nameof(System.Object)
相同。但是现在我们在规则上有一个奇怪的例外:nameof()
返回作为参数传递的表达式的确切字符串表示形式...除了object
(和另一个同义词)。这可能会导致细微问题,例如我可能会确保nameof(object)
返回"object"
,因为nameof(Table)
返回"Table"
而nameof(MyComponent.SomeProperty)
返回"SomeProperty"
,等等。使nameof()
在同义词上不可用肯定解决了歧义。