在6.1.6中。在C#语言规范中,有:
隐式参考转换是:
(...)
从任何引用类型到引用类型T,如果它具有隐式标识或引用转换为引用类型T0,则T0具有到T的标识转换。
为什么他们不这样说,更简单:
从任何引用类型到引用类型T(如果它具有隐式标识或引用转换为T。
有任何实际差异吗?
编辑:我意识到我错误地输入了规范,错误可能对问题很重要(规范说“隐式引用转换是”而不是“存在隐式转换”)答案 0 :(得分:12)
如果从S到T存在身份转换,那么S和T必须是同一类型吗?
您在规范中发现的奇怪之处在于将dynamic
添加到C#4.0中的语言中。在运行时,没有dynamic
这样的东西;相反,dynamic
只是一种类型,意思是“我真的是object
;请将程序的这一部分推迟到运行时”。
因此,List<object>
和List<dynamic>
之间存在身份转换。从C#编译器的角度来看,它们是不同的类型,因为myList[0].Frob()
会给前者而不是后者给出错误。但从运行时的角度来看,它们是相同的。因此,C#语言将转换从一个转换为另一个作为标识转换。在编译时,为了C#语言的目的,类型可以是不同的,但从运行时的角度来看,它们将是相同的。