2010-10-27 2 views
1

J'ai une classe similaire à la suivante qui utilise une liste interne:C# coulée Implicite à la liste <T> retours d'erreur d'exécution

public class MyList<T> : IEnumerable<T> 
{ 
     private List<T> _lstInternal; 
     public MyList() 
     { 
      _lstInternal = new List<T>(); 
     } 
     public static implicit operator List<T>(MyList<T> toCast) 
     { 
      return toCast._lstInternal; 
     } 

} 

Lorsque je tente de passer MyList<object> à une fonction qui prend une List<object>, je reçois un InvalidCastException. Pourquoi?

+0

Quelle version de C# utilisez-vous? J'utilise 4.0 et j'ai été capable de faire ce que vous décrivez ici sans 'InvalidCastException'. – Donut

+0

Y a-t-il une raison pour laquelle vous ne dérivez pas seulement de 'List '? – CodesInChaos

+0

@CodeInChaos, alors les utilisateurs de la classe seraient en mesure de muter la liste ou d'y accéder via un indexeur. Peut-être que l'auteur ne veut pas exposer cette fonctionnalité. –

Répondre

1

Utilisation de la classe que vous avez décrit, le code suivant a fonctionné pour moi:

static void Main(string[] args) 
{ 
    MyList<object> foo = new MyList<object>(); 

    MyMethod(foo); 
} 

static void MyMethod(List<object> things) 
{ 
    // No InvalidCastException when called... 
} 

La seule chose que je changé de la classe MyList<T> vous avez publié dans votre question ajoutait la mise en œuvre suivante de IEnumerable<T>:

IEnumerator<T> IEnumerable<T>.GetEnumerator() 
{ 
    return _lstInternal.GetEnumerator(); 
} 

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return _lstInternal.GetEnumerator(); 
} 

Pas vraiment sûr pourquoi vous obtenez une exception, sauf que, comme je l'ai mentionné dans mon commentaire, j'utilise C# version 4.0. Quelle version utilisez-vous?

+0

En fait, mon problème était que je passais l'objet à un projet différent, qui n'était pas au courant de la classe MyList, et par conséquent, il ne savait pas comment le lancer. Alors maintenant, je suis en train de lancer MyList avant de l'envoyer à l'autre projet. – Out4345

Questions connexes