在下面的示例代碼,爲什麼調用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