不能在泛型类型之间转换

时间:2011-08-11 15:11:55

标签: c# generics casting

我正在尝试这样做:

interface IA
{
}

class A : IA
{
}

class Foo<T> where T: IA
{
}

class Program
{
    static void Main( string[] args )
    {
        Foo<A> fooA = new Foo<A>();
        Foo<IA> fooIA = fooA as Foo<IA>;
    }
}

但是,从Foo<A>Foo<IA>的强制转换无法编译。我记得在List<T>之间投射时看到这样的协方差问题,但我认为它不适用于这样的简单泛型。

让这个演员阵容工作有什么好处?我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

所有通用都是不变的。另一方面,接口(和代表)可以支持协方差和反方差,但仅限于可以安全使用的情况。他们需要明确选择加入。

例如,通过IFoo<out T>IFoo<in T>

答案 1 :(得分:1)

interface IA
    {
    }

    class A : IA
    {
    }

    interface IFoo<T> where T : IA
    {
    }

    class Foo<T> : IFoo<T> where T : IA
    {
    }

    class Program
    {
        static void Main(string[] args)
        {
            IFoo<A> fooA = new Foo<A>();
            Foo<IA> fooIa = fooA as Foo<IA>;
        }
    }

答案 2 :(得分:1)

  

这些类对这些基类型执行操作,而且从不需要向下转换它们

那你为什么要开始Foo<A>?将其声明为Foo<IA>并将A添加到其中。

答案 3 :(得分:0)

对不起,这是在java中,但你可以这样做:

interface Alpha
{
}

class Beta implements Alpha
{
}  

class Foo<T>
{
}

class Program
{
    static void main(string[] args)
    {
        Foo<Beta> fooBeta = new Foo<Beta>();
        Foo<? implements Alpha> fooAlpha = fooBeta;
    }
}

这并不能完全解决问题,但是你可以在不知道Beta的情况下至少可以访问所有的Alpha方法......