为什么名字不能用同义词?

时间:2017-10-09 09:20:43

标签: c# nameof type-synonyms

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()运算符来使用同义词。

所以问题是:为什么没有实现它与objectstringint等一起使用?我猜错了(即它不可能实现)?或者它是设计的选择?

1 个答案:

答案 0 :(得分:4)

我认为这是设计的选择。

typeof()运算符返回Type。由于objectSystem.Object表达完全相同的Type,因此编写typeof(object)时没有问题。

同样适用于default():在两种情况下都是null(或0或其他)。

现在,对于nameof(),上下文有点困难。

假装允许nameof(object)。它应该返回什么?

  1. "object"。但现在结果与nameof(System.Object)不同,因为类是相同的,所以没有任何意义。
  2. "Object"大写,与nameof(System.Object)相同。但是现在我们在规则上有一个奇怪的例外:nameof()返回作为参数传递的表达式的确切字符串表示形式...除了object(和另一个同义词)。这可能会导致细微问题,例如我可能会确保nameof(object)返回"object",因为nameof(Table)返回"Table"nameof(MyComponent.SomeProperty)返回"SomeProperty",等等。
  3. 使nameof()在同义词上不可用肯定解决了歧义。