-1

这个问题中,我了解到nameof()C# 6.0 中引入的运算符不适用于同义词。所以你可以写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()操作符以使用同义词进行操作。

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

4

1 回答 1

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",等等。

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

于 2017-10-09T09:20:42.580 回答