12

在 6.1.6 中。在 C# 语言规范中,有:

隐式引用转换是:

(...)
从任何引用类型到引用类型 T,如果它具有到引用类型 T0 的隐式标识或引用转换,并且 T0 具有到 T 的标识转换。

他们为什么不说,更简单地说:

从任何引用类型到引用类型 T,如果它具有到 T 的隐式标识或引用转换。

有没有实际的区别?

编辑:我意识到我打错了规范,错误可能对问题很重要(规范说“隐式引用转换是”而不是“存在隐式转换”)

4

1 回答 1

12

如果存在从 S 到 T 的恒等转换,那么 S 和 T 一定是同一类型吗?

您在规范中发现的奇怪之处是由于添加dynamic到 C# 4.0 中的语言而产生的。在运行时没有这样的东西dynamic; 相反,dynamic它只是一种表示“我真的object;请将程序的这一部分分析推迟到运行时”的类型。

因此,在和之间存在身份转换。从 C# 编译器的角度来看,它们是不同的类型,因为前者会出错,而后者不会出错。但从运行时的角度来看,它们是相同的。因此,C# 语言将从一种转换到另一种的转换归类为身份转换。在编译时,对于 C# 语言而言,类型可能不同,但从运行时的角度来看,它们将是相同的。List<object>List<dynamic>myList[0].Frob()

于 2014-01-05T16:14:04.920 回答