代码之家  ›  专栏  ›  技术社区  ›  Adam Driscoll

显式Cast运算符、泛型、继承和接口

  •  0
  • Adam Driscoll  · 技术社区  · 14 年前

    这似乎不管用。有可能吗?

    public interface IInterface1 {}
    public interface IInterface2 { }
    
    public interface IMyT1 : IInterface1 {}
    public interface IMyT2 : IInterface2 {}
    
    public abstract class BaseClass<T1, T2> : Interface2 where T1 : IInterface1, where T2 : IInterface2
    {
         protected T1 T1Obj {get;set;}
    
         public static explicit operator T1(BaseClass<T1,T2> val)
         {
              return val.T1Obj;
         }
    }
    
    public class SomeClass : BaseClass<IMyT1, IMyT2>, ISomeClass {}
    

    InvalidCastException .

    ISomeClass mySomeClass = new SomeClass();
    var myT1 = (IMyT1)mySomeClass; //Boom!
    

    这可能很疯狂,但有可能吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Jon Skeet    14 年前

    你要找的是 一般方差 事实上 工作。

    在C#3和更早版本中根本不能使用它。在C#4中,您可以将其用于接口和委托,但仅在显式标记为使用 in out 在类型参数上适当地-编译器确保它基本上是安全的。

    如果你在这个网站上搜索通用方差或协方差与反方差,你会发现大量的信息。或者你可以看看 Eric Lippert's blog series C# in Depth 如果你在地图上搜索“协方差” NDC 2010 streaming video site 你可以流式传输或下载一个小时的演讲,我就这个主题。

        2
  •  1
  •   Matthew Whited    14 年前

    IMyT1

    这些是你的有效转换。。。

    var instance = new SomeClass();
    var localInterface = (ISomeClass)instance;
    var baseClass = (BaseClass<IMyT1, IMyT2>)instance;
    var baseInterface = (IInterface2)instance;
    

    ... 这个 instance 不是类型 IMyT1公司 , IMyT2 IInterface1 . 试图投出任何一个都会失败。如果 BaseClass SomeClass 继承自

    静态方法在编译时被解析,而强制转换在运行时被考虑。这也是你不能拥有的原因之一 virtual static 方法。