Aggiungere null a un elenco Lanciare un IList che lancia un’eccezione

Utilizzando .NET 3.5 e C # 3.0,

IList list = new List(); list.Add(null); 

Questo genera una ArgumentException, che sembra sbagliata.

 List list = new List(); list.Add(null); 

Funziona perfettamente.

Questo è un bug nel codice di Microsoft, quindi?

Un esempio di come produrre questo tipo di errore in una situazione di vita reale:

 new JavaScriptSerializer().Deserialize<List>("[true, false, null]"); 

Sì. Vedi http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/abc99fb5-e218-4efa-8969-3d96f6021cee/ per altri rapporti. Fondamentalmente quando si accede a List Tramite un’implementazione IList con caratteri deboli, viene eseguito un controllo di tipo prima di provare ad aggiungere l’elemento all’archivio interno e questo tipo verifica erroneamente il tipo per i tipi nullable.

È “By Design” e in modo esplicito. Il motivo per cui l’ List ha un’implementazione esplicita di IList . Filtra i valori passati ai vari metodi per eseguire un po ‘di controllo nullo. La logica è essenzialmente la seguente

 if (default(T) != null && value == null) { throw ... } 

In questo caso il valore predefinito di un tipo di valore (e nullable è un tipo di valore) non è nullo quindi non è consentito.

Ha! È divertente. Credo che abbia a che fare con l’idea che il bool nullable sia, a rigor di termini, implementato come una struttura e IList si aspetti un object, e forse si aspetta di inscatolare un bool o qualcosa del genere. Jon Skeet dove sei? Abbiamo bisogno di te! (picchietta ruby pantofole 3 volte)

Quando si chiama il metodo Add su IList con un valore nullo, si tratta di un riferimento null che si sta passando al metodo, non un valore nullable. Il riferimento null non può essere convertito in un valore nullable.

Il metodo Add si aspetta qualcosa che contenga un bool o un bool? . Poiché non è ansible inserire un valore nullo, non è ansible creare un object che è ansible utilizzare per aggiungere un valore nullo a IList .

Se si utilizza l’interfaccia generica IList , Non c’è alcun problema ad aggiungere il valore:

 IList list = new List(); list.Add(null); 

Come è stato sottolineato, c’è un bug nell’implementazione del metodo IList.Add (object item) nella class List in .NET 3.5 (e forse prima). Il fatto è che il metodo IList.Add (object dell’object) prova a verificare che l’object, stiamo cercando di aggiungere sia un object compatibile con l’argomento List generico, che fallisce quando stiamo provando ad aggiungere null alla lista dei tipi di valori nullable.

La mia soluzione alternativa riguarda la riflessione ottenendo e invocando il metodo Aggiungi (object T) dall’object Elenco.

 IList list = new List(); MethodInfo addMethod = list.GetType().GetMethod("Add"); addMethod.Invoke(list, new object[] { null }); 

Stai mescolando l’ List generico List con l’ IList non generico. List eredita da IList e non da IList .