什么是“从任何类型S到任何接口类型T,只要S没有密封并且S没有实现T.”实际上意味着

时间:2010-09-15 07:21:26

标签: c# specifications

什么是“从任何类型S到任何接口类型T,只要S未密封且提供S未实现T 。”实际上是什么意思?

我在C#语言规范here中看到了这一点:

  

6.2.4明确的引用转换

     

显式引用转换   是:

     
      
  • ...
  •   
  • 从任何类型S到任何接口类型T,只要S不是   密封并提供S没有   实施T.
  •   

我能理解“提供S没有密封”的意思,但我不确定我是否理解“如果S没有实现T”的意思真的意思。

例如:

class S {}//not sealed, nor does it implement T
interface T {}
...
T t = (T)new S();//will throw InvalidCastException.

可能只是在规范中枚举所有语法正确的表达显式引用转换的方式,无论它是否会引发异常?或者它是否意味着其他一些我不知道的事情(截至目前)?

提前致谢。

4 个答案:

答案 0 :(得分:6)

双关语在“未密封”部分:

class S {} //not sealed, nor does it implement T
interface T {}

class S2 : S, T { }

  S s = new S2();   // S reference to an S2 instance, implicit conversion
  T t = (T)s;       // OK, s refers to an S2 instance that does implement T
  

可能只是在规范中列举了表达显式引用转换的所有语法正确方法,...

是的,编译器必须允许它,除非它知道转换是不可能的。

如果你看T t = (T)s;,如果S被密封,那么编译器可以肯定地知道转换是不可能的。但是如果使用未密封的S,则必须消除s引用S2类型的可能性,这是不可行的/可能的(S2可能在另一个程序集中)。< / p>

答案 1 :(得分:0)

你确定这不是文中的错误吗?

如果S 实施T。

编辑:我找到了参考:http://msdn.microsoft.com/en-us/library/aa691291(v=VS.71).aspx

那是显式引用转换,这意味着它不是隐含的! 所以句子“从任何类型类型S到任何接口类型T,如果S没有被密封并且提供S没有实现T”是正确的,它不能是隐式转换,所以它必须是显式的(并且不能保证)它会成功的。)

答案 2 :(得分:0)

规范说:

  

显式引用转换是引用类型之间的转换,需要运行时检查以确保它们是正确的。

换句话说,这里列出的转换类型是那些显式转换,由于这两种类型之间缺乏明确的关系,编译器无法检查这种转换是否可能并且在编译时是否有效。这种转换尝试将在程序执行期间得到解决,如果转换不可能,可能会导致异常。

可能失败但也可能成功的运行时显式转换的规范示例是从接口类型S到接口类型T的转换,其中S和T不相关。成功取决于底层对象是否实现了两个接口。

您询问的案例的特别好奇的例子 - 从类型S到接口类型T,其中S没有实现T(并且没有密封),当S是COM对象时,T是一个COM接口未在类型库中明确列出,由coclass实现。在这种情况下,转换可能会失败,但它也可能成功,具体取决于coclass的特定IUnknown :: QueryInterface实现是什么。 (注意,从技术上讲,在这种情况下,coclass正在实现接口,但不会将其通告给编译器)

当然,@Henk Holterman的例子是S2:S,T也是转换成功的好例子。

答案 3 :(得分:-1)

似乎所有关于用户定义的转换。

如果S没有实现T,你绝对不能将类S转换为接口T.