Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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_Types_Parameters_Implicit Conversion - Fatal编程技术网

C#泛型类类型参数(无法隐式转换)

C#泛型类类型参数(无法隐式转换),c#,generics,types,parameters,implicit-conversion,C#,Generics,Types,Parameters,Implicit Conversion,场景: class A { } class B : A { } class C<T> where T: A { } class A{} B类:A{} 类C,其中T:A{} 问题 当B是a的子类时,为什么不能C=C? 它抛出“无法隐式转换”错误 谢谢 --更新-- 我可以为C创建一个隐式方法来识别C?您要求的是泛型中的协方差和逆变,它只适用于接口和委托。你可以查一下 您可以在框架>=4中执行以下操作: interface IC<out T> where T : A

场景:

class A { }

class B : A { }

class C<T> where T: A { }
class A{}
B类:A{}
类C,其中T:A{}
问题

当B是a的子类时,为什么不能
C=C
? 它抛出“无法隐式转换”错误

谢谢

--更新--
我可以为
C
创建一个隐式方法来识别
C

您要求的是泛型中的协方差和逆变,它只适用于接口和委托。你可以查一下

您可以在框架>=4中执行以下操作:

interface IC<out T> where T : A

class C<T> : IC<T>  where T : A

IC<A> ica = new C<B>();
接口IC,其中T:A
C类:IC,其中T:A
IC ica=新的C();

对于您的案例,您应该为
类C

提取一个接口,您要求的是泛型中的协方差和逆变,这仅适用于接口和委托。你可以查一下

您可以在框架>=4中执行以下操作:

interface IC<out T> where T : A

class C<T> : IC<T>  where T : A

IC<A> ica = new C<B>();
接口IC,其中T:A
C类:IC,其中T:A
IC ica=新的C();
对于您的情况,您应该为
类C
提取一个接口,为什么当B是a的子类时C=C?
B
a
的子类,但
C
不是
C
的子类。
C
C

之间没有赋值兼容性,为什么当B是a的子类时C=C不能?
B
a
的子类,但
C
不是
C
的子类。
C
C
之间没有分配兼容性,因为
C
不是
C

事情是这样的;如果你能做到的话

C<A> myA = new C<B>();
myA.Add(new A());
cmya=newc();
myA.Add(新的A());
你会遇到问题,因为
B是a
,而不是
a是B
,因为
C
不是
C

事情是这样的;如果你能做到的话

C<A> myA = new C<B>();
myA.Add(new A());
cmya=newc();
myA.Add(新的A());
您可能会遇到一个问题,因为
B是a
,而不是
a是B
如果您需要这样做,请使用
,并且因为co variant仅适用于接口和委托,所以请使用魔术词定义接口,而不是类:

interface IC<out T> where T : A
{
}
接口IC,其中T:A
{
}
因此,您可以根据需要分配:

class CA : IC<A>
{}

class CB : IC<B>
{ }

IC<A> x = new CA();
IC<B> y = new CB();

x = y;
类别CA:IC
{}
CB类:集成电路
{ }
IC x=新的CA();
IC y=新的CB();
x=y;
如果需要,请使用,因为co variant仅适用于接口和委托,所以请使用神奇的单词而不是类来定义接口:

interface IC<out T> where T : A
{
}
接口IC,其中T:A
{
}
因此,您可以根据需要分配:

class CA : IC<A>
{}

class CB : IC<B>
{ }

IC<A> x = new CA();
IC<B> y = new CB();

x = y;
类别CA:IC
{}
CB类:集成电路
{ }
IC x=新的CA();
IC y=新的CB();
x=y;

请重新阅读您的问题。“为什么C=C”是什么意思?提供一个编译代码段,使我们能够重现您的问题。C=C是什么意思?请参阅和。你要找的关键词是协方差和逆变:)它与C有关,不支持泛型的协方差。你也可以在上面找到一些信息,请重新阅读你的问题。“为什么C=C”是什么意思?提供一个编译代码段,使我们能够重现您的问题。C=C是什么意思?请参阅和。你要寻找的关键词是协方差和逆变:)它与C有关,不支持泛型的协方差。你也可以在上面找到一些信息