In C # è legale scrivere
Animal[] a = new Giraffe[4]; //with obvious relationships
Perché gli array sono covarianti. Tuttavia, questa è una relazione di rottura. È un'eccezione di runtime per applicare quindi un diverso tipo di animale a questo array perché il backing store è un Giraffe
.
a[0] = new Cat(); //KABOOM
Perché il linguaggio non crea un backing store covariante? Questo non sembra essere una limitazione del linguaggio perché posso creare personalmente questo tipo di struttura dati:
class Program
{
static void Main(string[] args)
{
A[] a = new B[2];
a[0] = new B();
a[1] = new C();//runtime exception
var containerLegal = new Container<B, A>();
containerLegal.Add(new B());
containerLegal.Add(new C());//works fine
}
}
class A { }
class B : A { }
class C : A { }
class Container<T,S> where T: class, S
{
S[] s = new S[4];
int currentIndex = 0;
public void Add(S t)
{
s[currentIndex] = t;
currentIndex++;
}
}
Sto barando un po 'perché non sto usando T
in Container<>
... ma penso che sia comunque una relazione giusta.