在下面的示例代码,为什么调用ArrayMethod失败的genric类型时我不包括class
约束传递一个数组
public interface IFoo { }
public interface IBar : IFoo { }
public class Test
{
public void ClassConstraintTest<T>() where T : class, IFoo
{
T[] variable = new T[0];
ArrayMethod(variable);
}
public void GenericTest<T>() where T : IFoo
{
T[] variable = new T[0];
ArrayMethod(variable); // Compilation error: Can't convert T[] to IFoo[]
}
public void InheritanceTest()
{
IBar[] variable = new IBar[0];
ArrayMethod(variable);
}
public void ArrayMethod(IFoo[] args) { }
}
一个好的类型系统应该有一个协变类型,它可以用作一个数组,它的项目可以在数组中被读取,交换或复制。 .NET和Java中的数组类型可以安全地以协变方式用作这种类型,并且可以以非协变方式安全地用作可自由写入的集合。也许最好是有多种引用数组,有不同的广告能力,但恕我直言,那些简单地说,协变阵列是一个“错误”的人并没有真正计算出替代品的成本。 – supercat