协变问题 [英] Covariance issue
本文介绍了协变问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
class A
{
}
class B:A
{
}
class C< T> T:A
{
保护T属性{get;组; }
}
class D:C< B>
{
}
class MainClass
{
public static void Main(string [] args)
{
C< A> x = new D();
//错误CS0029:不能隐式地将`SampleApp.D'类型转换为`SampleApp.C< SampleApp.A>'(CS0029)(SampleApp)
}
}
我不明白为什么这是失败的,因为 D
更宽因为它实现了 C< B>
,并且 B:A
。任何解决方法?
解决方案
如果您可以使用C#4.0,则可以编写以下代码。
class A {}
class B:A {}
interface IC< out T> {}
class C< T> :IC管芯; T>其中T:A {保护T属性{get;组; }}
class D:C< B> {}
class MainClass {
public static void Main()
{
IC< A> x = new D();
}
}
I'm facing a bit of problem with the following casting:
class A
{
}
class B : A
{
}
class C<T> where T : A
{
protected T property { get; set; }
}
class D : C<B>
{
}
class MainClass
{
public static void Main (string[] args)
{
C<A> x = new D();
// Error CS0029: Cannot implicitly convert type `SampleApp.D' to `SampleApp.C<SampleApp.A>' (CS0029) (SampleApp)
}
}
I don't understand why this is failing since D
is wider than C<A>
since it implements C<B>
, and B : A
. Any workarounds?
解决方案
If you can use C# 4.0, you can write the following code.
class A { }
class B : A {}
interface IC<out T> {}
class C<T> :IC<T> where T : A { protected T property { get; set; } }
class D : C<B> {}
class MainClass {
public static void Main()
{
IC<A> x = new D();
}
}
这篇关于协变问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文