C#将通用子类型转换为父类

时间:2017-06-18 12:48:41

标签: c# generics inheritance

我们说我们有这些类型:

class A {}
class B : A {}

class X<T> {}

为什么我们不能这样做?

X<A> var = new X<B>();

是否有可用的解决方法?

[编辑] 我尝试使用协方差,但它失败了,因为我想访问X中类型为T的属性,而C#不允许在接口中使用类型T:

interface IX<out T> {
    T sth {set; get;}
}

class X<T>: IX<T> {
    T sth { set; get; }
}

[编辑2] 我也试过了,但失败了:

class X<T> where T : A
{
    public T sth { set; get; }

    public static implicit operator X<T>(X<B> v)
    {
        return new X<T>
        {
            sth = v.sth,
        };
    }
}

奇怪的是,C#不允许演员表演。#/ p>

2 个答案:

答案 0 :(得分:1)

问题是类不支持协方差和反演,只有接口:

class A { }
class B : A { }

class X<T> : P<T> { }

interface P<out T>
{
}

...

P<A> var = new X<B>();

Covariance and Contravariance FAQ

答案 1 :(得分:1)

您需要协方差(使用单词T标记类型参数out):

interface IX<out T> {}

仅允许使用接口类型(和委托类型)。类型B必须是引用类型(class,就像这里一样)。

然后这很好:

IX<B> ixb = ...;
IX<A> ok = new IX<B>();