泛型类型的奇怪行为

Gop*_*her 3 c# generics

请看下面的简单代码

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:初始问题出错.现在修好了

Jon*_*eet 6

想象一下如果你做了会发生什么:

public class C : A{}

G<C> x = new G();
C c = x.GetT();
Run Code Online (Sandbox Code Playgroud)

你真的不希望它返回一个B引用...

as运营商工作,因为那会刚刚返回null,如果T不是非此即彼BA......但是这可能不是真正的你是什么意思.

在不知道你想要做什么的情况下,很难知道建议的行动方案.


Bol*_*ock 5

根据更新重新设计的答案

虽然A符合通用约束where T : A,但它是一种具体类型.但是,您的泛型类的GetT()方法具有泛型返回类型T,因此您必须将具体类型转换为泛型类型以使返回兼容.

旧答案适用于您之前的返回案例new B().


老答案

泛型类型约束表示T必须继承A; 然而,它并没有T必须B(或它的推导),虽然B发生在它自身继承A并满足约束.

因此返回类型不兼容(B总是B,但T不一定B),并且您得到错误.