C# 为什么不允许使用(对象)的名称?

C# 为什么不允许使用(对象)的名称?,c#,c#-6.0,nameof,C#,C# 6.0,Nameof,在C#6.0中,您可以编写以下代码: var instance = default(object); var type = typeof(object); var name = nameof(object); var name = nameof(System.Object); 它们具有相同的结果: var instance = default(System.Object); var type = typeof(System.Object); 但你不能这样写: var instance =

在C#6.0中,您可以编写以下代码:

var instance = default(object);
var type = typeof(object);
var name = nameof(object);
var name = nameof(System.Object);
它们具有相同的结果:

var instance = default(System.Object);
var type = typeof(System.Object);
但你不能这样写:

var instance = default(object);
var type = typeof(object);
var name = nameof(object);
var name = nameof(System.Object);
它会生成以下错误:

无效的表达式术语“对象”

但你仍然可以这样写:

var instance = default(object);
var type = typeof(object);
var name = nameof(object);
var name = nameof(System.Object);

为什么
nameof(object)
不编译?

区别在于
object
是类
object
的同义词,而
nameof()
对同义词不起作用


这同样适用于
nameof(int)
vs
nameof(Int32)

尝试:
nameof(Object)
nameof()
对同义词不起作用,只对原始类名起作用。
object
是C语言中的一个关键字。关键字对于编译器来说是一件大事,它们可以消除语法歧义并帮助生成良好的错误消息。但是,由于关键字不是标识符,所以nameof()无法工作,关键字是构建语言的坚实基础。语句中具有完全明确含义的部分,解析器可以依靠这些部分仅表示一件事。如果解析器不能依赖这样的保证,那么它必须猜测程序员的意图。猜测永远不会产生好的错误消息,它可能会猜错并把程序员送进兔子洞。从技术上讲,在解析操作数名称的特定情况下,编译器仍然能够识别
对象
。不过,这会使表达式解析器非常难看。@Hans您的意思是像ideone(Mono)的“CS1525:意外符号
,在
名称(对象)
?:)之后应该是
)是的,很好的例子:)Mono将其视为标识符,而不是关键字,tsk,tsk。相关文档:“下面值得一提的是产生错误的原因:预定义类型(例如int或void)”@Rob这是参考,而不是规范。从技术上讲,
System.Object
是一个预定义的简单类型,并且
Object
是它的别名,因此两者都不应该根据该描述工作。。。