为什么名称对同义词不起作用?
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()
运算符也可以使用同义词进行运算。
所以问题是:为什么它没有实现与 object
、string
、int
等一起使用?我的猜测是错误的吗(即不可能实施)?还是设计的选择?
我认为这是设计的选择。
typeof()
运算符 return 是 Type
。因为object
和System.Object
表达的是完全一样的Type
,所以写成typeof(object)
.
是没有问题的
这同样适用于 default()
:在两种情况下都是 null
(或 0
或其他)。
现在,对于 nameof()
,上下文有点困难。
假装 nameof(object)
是允许的。应该是什么 return?
"object"
。但是现在结果与 nameof(System.Object)
不同,并且没有意义,因为 class 是相同的。
"Object"
大写,与nameof(System.Object)
相同。但是现在我们在规则上有一个奇怪的例外:nameof()
returns 作为参数传递的表达式的精确字符串表示...除了 object
(和其他同义词)。这可能会导致微妙的问题,例如我可能会肯定 nameof(object)
returns "object"
因为 nameof(Table)
returns "Table"
和 nameof(MyComponent.SomeProperty)
returns "SomeProperty"
, 等等.
使 nameof()
在同义词上不可用肯定解决了歧义。
从 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()
运算符也可以使用同义词进行运算。
所以问题是:为什么它没有实现与 object
、string
、int
等一起使用?我的猜测是错误的吗(即不可能实施)?还是设计的选择?
我认为这是设计的选择。
typeof()
运算符 return 是 Type
。因为object
和System.Object
表达的是完全一样的Type
,所以写成typeof(object)
.
这同样适用于 default()
:在两种情况下都是 null
(或 0
或其他)。
现在,对于 nameof()
,上下文有点困难。
假装 nameof(object)
是允许的。应该是什么 return?
"object"
。但是现在结果与nameof(System.Object)
不同,并且没有意义,因为 class 是相同的。"Object"
大写,与nameof(System.Object)
相同。但是现在我们在规则上有一个奇怪的例外:nameof()
returns 作为参数传递的表达式的精确字符串表示...除了object
(和其他同义词)。这可能会导致微妙的问题,例如我可能会肯定nameof(object)
returns"object"
因为nameof(Table)
returns"Table"
和nameof(MyComponent.SomeProperty)
returns"SomeProperty"
, 等等.
使 nameof()
在同义词上不可用肯定解决了歧义。