为什么我不能使用与继承接口相同的泛型类型?

Rub*_*ans 2 c#

嗨,我有以下场景,我将尽力解释,如果这是一个愚蠢的问题,请提前预测.我有两个接口(出于本示例的目的,它们中没有任何内容)

public interface interfaceA {}
public interface interfaceB: interfaceA {}
Run Code Online (Sandbox Code Playgroud)

还有2节课

public classA<interfaceA> {}
public classB: classA<interfaceB> { }
Run Code Online (Sandbox Code Playgroud)

现在还有其他地方我有一个接受泛型类型作为参数的方法:

public static void DoSomething( ClassA<interfaceB> p_val ) {}
Run Code Online (Sandbox Code Playgroud)

好的,我在创建对象时使用这些类.

ClassB obj1 = new ClassB();
ClassA<interfaceA> obj2 = new ClassA<interfaceA>();
Run Code Online (Sandbox Code Playgroud)

好吧,当我将obj1传递给DoSomething()时,当我尝试将obj2传递给我的DoSomething()方法时,我得到一个编译错误,说它无法从interfaceA转换为interfaceB.

这种意义有道理,因为在我的方法中,泛型param类型是显式的interfaceB.但是,如果我希望该方法接受两种泛型类型(obj1和obj2),我该怎么办?希望这是有道理的.

sep*_*p2k 6

怎么样

public static void DoSomething<T>( ClassA<T> p_val)
{}
Run Code Online (Sandbox Code Playgroud)

无论类型参数是什么,它都接受ClassA的任何实例.或者,如果你只希望接受的情况下ClassA<T>,当TInterfaceA还是其子类,你可以这样做:

public static void DoSomething<T>( ClassA<T> p_val) where T : InterfaceA
{}
Run Code Online (Sandbox Code Playgroud)