什么是“从任何类型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.
可能只是在规范中枚举所有语法正确的表达显式引用转换的方式,无论它是否会引发异常?或者它是否意味着其他一些我不知道的事情(截至目前)?
提前致谢。
答案 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.