协变问题 [英] Covariance issue

查看:105
本文介绍了协变问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆