为什么名称对同义词不起作用?

Why doesn't nameof work on synonymous?

我了解到 C# 6.0 中引入的 nameof() 运算符不适用于同义词。所以你可以写 nameof(System.Object) 而不是 nameof(object).

现在,还有另外 2 个类似的运算符,typeof()default(),它们在同义词上工作得很好。你可以这样写:

default(object);
default(int);
typeof(string);
typeof(long);

以及:

default(Object);
default(Int32);
typeof(String);
typeof(Int64);

结果是一样的

我想构建 nameof() 运算符也可以使用同义词进行运算。

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

我认为这是设计的选择。

typeof() 运算符 return 是 Type。因为objectSystem.Object表达的是完全一样的Type,所以写成typeof(object).

是没有问题的

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

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

假装 nameof(object) 是允许的。应该是什么 return?

  1. "object"。但是现在结果与 nameof(System.Object) 不同,并且没有意义,因为 class 是相同的。
  2. "Object"大写,与nameof(System.Object)相同。但是现在我们在规则上有一个奇怪的例外:nameof() returns 作为参数传递的表达式的精确字符串表示...除了 object(和其他同义词)。这可能会导致微妙的问题,例如我可能会肯定 nameof(object) returns "object" 因为 nameof(Table) returns "Table"nameof(MyComponent.SomeProperty) returns "SomeProperty", 等等.

使 nameof() 在同义词上不可用肯定解决了歧义。