2009-06-04 9 views
0

Vu le code suivant:Génériques: pourquoi pas compiler?

class A<T> 
{ 
    internal void Add(T obj) { } 
} 

class C { } 

class B<T> where T : C 
{ 
    public B() 
    { 
    A<T> a = new A<T>(); 
    a.Add(new C()); 
    } 
} 

L'appel à Add ne compile pas. Il fait quand je l'ai jeté à T première:

a.Add((T)new C()); 

Il est peut-être la privation de sommeil, mais qu'est-ce que je manque ici?

Si T est de type C (notez la contrainte sur B), alors pourquoi n'est pas A<T> équivalent à A<C>?

Répondre

4

Parce que si B ont été déclarés avec un type de D , ce qui serait une classe qui étend C, alors l'ajout d'un nouveau C violerait le type.

+0

Merci, ça m'a échappé :) – JulianR

+1

Mon esprit est officiellement soufflé. :) –

+0

Mais seulement si ce n'était pas .NET 4 avec contravariance pour D et C dans B. –

3

car T pourrait être une sous-classe de C.

vous ne pouvez pas ajouter un bob animal = new poisson() à une liste <girafe>

2

A.Add() attend un T. Vous lui donnez un C. C'est correct tant que le compilateur sait qu'un C est un T.

Mais ce n'est pas ce que dit votre contrainte. Il dit seulement qu'un T est un C, ce qui est le contraire.

+0

Je trouve votre explication beaucoup plus facile à analyser que celle de Yishai. – Brian

Questions connexes