如果从S到T存在身份转换,那么S和T必须是同一类型吗?

时间:2014-01-05 15:25:06

标签: c# language-specifications

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

  

隐式参考转换是:

     

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

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

  

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

有任何实际差异吗?

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

1 个答案:

答案 0 :(得分:12)

  

如果从S到T存在身份转换,那么S和T必须是同一类型吗?

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

因此,List<object>List<dynamic>之间存在身份转换。从C#编译器的角度来看,它们是不同的类型,因为myList[0].Frob()会给前者而不是后者给出错误。但从运行时的角度来看,它们是相同的。因此,C#语言将转换从一个转换为另一个作为标识转换。在编译时,为了C#语言的目的,类型可以是不同的,但从运行时的角度来看,它们将是相同的。