Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型类型的奇怪行为_C#_Generics - Fatal编程技术网

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
,因此您不能只返回A
B
,因为
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;