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