请看下面的简单代码
public class A{}
public class B: A{}
public class G<T> where T : A
{
public T GetT()
{
return new A();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码不正确 - 编译器错误"无法将A转换为返回类型T".但A实际上是T.如果我改变了
return new A();
Run Code Online (Sandbox Code Playgroud)
至
return new A() as T;
Run Code Online (Sandbox Code Playgroud)
一切都好.这种行为的原因是什么?提前致谢
UPD:初始问题出错.现在修好了
想象一下如果你做了会发生什么:
public class C : A{}
G<C> x = new G();
C c = x.GetT();
Run Code Online (Sandbox Code Playgroud)
你真的不希望它返回一个B引用...
该as运营商工作,因为那会刚刚返回null,如果T不是非此即彼B或A......但是这可能不是真正的你是什么意思.
在不知道你想要做什么的情况下,很难知道建议的行动方案.
根据更新重新设计的答案
虽然A符合通用约束where T : A,但它是一种具体类型.但是,您的泛型类的GetT()方法具有泛型返回类型T,因此您必须将具体类型转换为泛型类型以使返回兼容.
旧答案适用于您之前的返回案例new B().
老答案
泛型类型约束表示T必须继承A; 然而,它并没有说T必须B(或它的推导),虽然B发生在它自身继承A并满足约束.
因此返回类型不兼容(B总是B,但T不一定B),并且您得到错误.