C# 泛型类型的奇怪行为
请看下面的简单代码C# 泛型类型的奇怪行为,c#,generics,C#,Generics,请看下面的简单代码 public class A{} public class B: A{} public class G<T> where T : A { public T GetT() { return new A(); } } return new A() as T; 到 return new A() as T; 一切都好。这种行为的原因是什么? 提前谢谢 return new A() as T; UPD:最
public class A{}
public class B: A{}
public class G<T> where T : A
{
public T GetT()
{
return new A();
}
}
return new A() as T;
到
return new A() as T;
一切都好。这种行为的原因是什么?
提前谢谢
return new A() as T;
UPD:最初的问题有一个错误。现在修复了基于更新修改的答案
return new A() as T;
虽然A
满足一般约束其中T:A
,但它是一种具体类型。但是,泛型类的GetT()
方法的泛型返回类型为T
,因此必须将具体类型强制转换为泛型类型,以使返回兼容
return new A() as T;
旧答案适用于您以前返回new B()
的情况
return new A() as T;
旧答案
return new A() as T;
泛型类型约束表示T
必须继承自A
;然而,它并没有说T
必须是B
(或它的派生),尽管B
本身恰好继承自a
并满足约束
return new A() as T;
因此返回类型不兼容(
B
始终是B
,但t
不一定是B
),您会得到错误。其中t:A
意味着t必须从A继承。因此,t
可能不是A
,因此您不能只返回AB
,因为C
也可能继承自A
,但是B
不是C想象一下如果你这样做会发生什么:
return new A() as T;
public class C : A{}
G<C> x = new G();
C c = x.GetT();
公共类C:A{}
G x=新的G();
C=x.GetT();
你真的不希望它返回一个B
引用
return new A() as T;
as
操作符工作,因为如果T
不是B
或A
,那么它将返回null
。。。但这可能不是你真正的意思
return new A() as T;
如果不知道你想做什么,就很难知道建议的行动方针。相同的代码,只是名称发生了变化
return new A() as T;
public class Animal{}
public class G<T> where T : Animal
{
public T GetT()
{
return new Animal();
}
}
Fish fish = new G<Fish>().GetT();
公共类动物{}
公共类别G,其中T:动物
{
公共T GetT()
{
归还新动物();
}
}
Fish-Fish=newg().GetT();
但是GetT()不返回鱼,它返回一个匿名的“动物”。有一个问题:即使事实正好相反,但并非所有动物都是鱼。如果需要鱼,您不能返回动物,也不能返回任何其他种类的动物。好,即使更改返回新B();要返回新的A();,我犯了个错误。将新的A()返回为T;作品fine@Gopher:A
是具体的,但T
是通用的。因为返回类型是泛型的,所以返回的内容必须是泛型的。这就是解释。谢谢我觉得你的答案有点令人困惑。我想如果你说B不一定是T,会更清楚。
return new A() as T;