C# - 通用类中的阵列协方差

时间:2009-01-24 19:34:32

标签: c# generics covariance

我知道C#支持这样的数组中的协方差:

object[] array = new string[3];

但是当我尝试编译以下代码时,我收到错误

class Dummy<K,T> where T:K
{
    public void foo()
    {
        K[] arr = new T[4];
    }
}

它说“不能隐式地将类型'T []'转换为'K []'”

为什么我收到此错误???

2 个答案:

答案 0 :(得分:12)

您必须指定T和K都是引用类型。数组协方差仅适用于引用类型。将声明更改为:

class Dummy<K,T> where T : class, K

它工作正常。您不必指定K是引用类型,因为如果T是引用类型并且它派生自或实现K,那么K也必须是引用类型。 (至少我认为这是推理。为了清晰起见,添加where K : class并没有什么坏处。)

答案 1 :(得分:-1)

类型T必须支持隐式转换为K.例如

T a = new T(); K b = a;

必须有效。