我试图创建一个泛型类,它接收基于接口的泛型参数,代码是异常
所以我测试了,我有以下内容
interface InterfaceA { }
interface InterfaceB<T> where T:InterfaceA { }
class ClassA : InterfaceA { }
class ClassB : InterfaceB<ClassA> { }
Run Code Online (Sandbox Code Playgroud)
基本测试
InterfaceB<InterfaceA> my_object_1 = new ClassB(); // Not Working (Compile error)
InterfaceB<InterfaceA> my_object_2 = (InterfaceB<InterfaceA>)new ClassB(); // Not Working (Throw Exception)
InterfaceB<InterfaceA> my_object_3 = new ClassB() as InterfaceB<InterfaceA>; // Working but still null
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么my_object_1,my_object_2和my_object_3出现问题?
这是真的,new ClassB() as InterfaceB<InterfaceA>并没有抛出异常,但它的回报null,这是什么as做的时候才可以不投.这是因为无论你如何投射它ClassB都不能用作InterfaceB<InterfaceA>.
但是,如果你之前提出的话,它可以隐式使用:InterfaceB<InterfaceA>outT
interface InterfaceB<out T> where T:InterfaceA { }
Run Code Online (Sandbox Code Playgroud)
这使得T协变,这意味着,例如,a InterfaceB<ClassA>可以用作InterfaceB<InterfaceA>(但反之亦然).
如果T不能协变,编译器将会输出错误,因为你在T某个地方作为输入.有了这样的接口,你不能用逻辑ClassB作为InterfaceB<InterfaceA>,出于同样的原因,与工作List<string>作为一个IList<object>没有任何意义:你可以尝试做一些事情是不可能的,像添加非字符串对象的字符串列表.