代码之家  ›  专栏  ›  技术社区  ›  blizpasta

“从任何类类型S到任何接口类型T,只要S不密封,只要S不实现T”到底是什么意思?

  •  7
  • blizpasta  · 技术社区  · 15 年前

    如果S不是密封的并且 假设S不实现T

    我在C语言规范中遇到过这个问题 here :

    是:

    • 从任何类类型S到任何接口类型T,只要S不是 密封的和提供的 工具T。

    例如:

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

    提前谢谢。

    4 回复  |  直到 11 年前
        1
  •  6
  •   Henk Holterman    11 年前

    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 正在引用 S2 类型,这是不实际/不可能的(S2可能在另一个组件中)。

        2
  •  0
  •   vulkanino    15 年前

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

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

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

        3
  •  0
  •   Franci Penov    15 年前

    说明书上说:

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

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

    当然,@Henk Holterman,S2:S,T的例子也是一个很好的例子,在这个例子中,转换可以成功。

        4
  •  -1
  •   Dmitry Karpezo    15 年前

    似乎都是关于用户定义的转换。

    如果S没有实现t,那么肯定不能将类S强制转换为接口t。

    推荐文章