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

2024-05-12

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

隐式引用转换为:

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

他们为什么不直接说:

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

是否有任何事实差异?

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


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

您在规范中发现的奇怪现象是由于添加了dynamic到 C# 4.0 中的语言。在运行时不存在这样的事情dynamic;相当,dynamic只是一种表示“我真的object;请将程序这部分的分析推迟到运行时”。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐