【问题标题】:Why doesn't nameof work on synonymous?为什么名称不用于同义词?
【发布时间】:2017-10-09 09:20:42
【问题描述】:

this question 我了解到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 等一起使用?我的猜测错了吗(即不可能实现)?或者这是一个设计的选择?

【问题讨论】:

  • 除非语言设计者之一回答这个问题,否则这个问题的任何答案都将主要基于意见......
  • 简单地说:typeofdefault 处理类型,而nameof 处理更多。真正的问题是为什么 你认为 nameof 应该使用类似于例如typeof.
  • @MatthewWatson,是的,可能你是对的......你认为我应该把问题改成类似 “在同义词上禁止 nameof() 的利弊是什么? "?它会更少基于意见吗?或者你知道我们怎样才能得到某个 C# 人的确认吗? :-)
  • 你不能在 StackOverflow 上提出这样的问题,因为它无法得到客观的回答。

标签: c# nameof type-synonyms


【解决方案1】:

我认为这是一个设计的选择。

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() 在同义词上不可用肯定解决了歧义。

【讨论】:

  • 但是你关于the result is different from nameof(System.Object) 的论点也适用于typeof(object).FullName ("System.Object") 和typeof(Object).FullName (也是"System.Object") 和typeof(System.Object).FullName (同样是"System.Object")。对象”)。
  • @MatthewWatson 我看不出它如何也适用于typeof().FullNametypeof() 大约是一个Type,而不是“字符串表示”,objectSystem.Object 下的Type完全相同相同。更进一步,该属性称为FullName。 "Full" 限定符避免了任何可能的残留歧义。
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
相关资源
最近更新 更多