12
votes

Ajouter NULL à une liste Cast comme une iliste jeter une exception

Utilisation de .NET 3.5 et C # 3.0,

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


2 commentaires

FYI: Visual Studio 2010 Beta 2, Framework 4.0 (non client 4.0): (doit inclure la référence: Utilisation de System.Collections): IList Liste = nouvelle liste (); list.add (null); compile, et, à l'exécution: définir un point de rupture après exécution, ouvrant la fenêtre de commande et exécuter? liste [0] imprime 'null.


Fait intéressant, cela fonctionne à Mono.


6 Réponses :


-1
votes

Vous mélangez la liste générique avec le iList . Liste hérités de ilist et non de ilist . .


1 commentaires

Je suppose que vous vouliez dire votre premier iList à être ilist (T) de MSDN.MicRosoft. com / fr-nous / bibliothèque / 6sh2ey19.aspx , liste de classes publics (T): ilist (t), icollection (t), iEnumerable (t), iList, icollection, iénumérable (supports angles modifiés entre parenthèses) Il hérite des deux, correctement.



14
votes

Oui, c'est. Voir http: // social .msdn.microsoft.com / Forums / FR-US / NetFXBCl / Filetage / ABC99FB5-E218-4FA-8969-3D96F6021CEE / pour d'autres rapports. Fondamentalement, lorsque vous accédez à la liste à travers sa implémentation ilon taped-tapé faible, il fait une vérification de type avant d'essayer d'ajouter l'élément au stockage interne - et obtient ce type de contrôle types nullables.


1 commentaires

La réponse est "Oui, c'est en fait un bogue" pour une fois au lieu de "Non, tu es foucié ici ..." Savourant le moment ...: D



1
votes

ha! C'est un drôle. Je crois que cela a à voir avec l'idée que la nullable bool est, strictement parlant, mise en œuvre comme une structure et ilist s'attend à un objet, et peut-être que cela s'attend à encadrer un bool ou quelque chose. Jon Skeet Où es-tu? Nous avons besoin de toi! (Taps Pantoufles Ruby 3 fois)


0 commentaires

3
votes

C'est "par conception" et explicitement. La raison pour laquelle est cette liste a une implémentation explicite de iList . Il filtre les valeurs transmises aux différentes méthodes pour effectuer un peu de vérification nulle. La logique est essentiellement la suivante xxx

dans ce cas, la valeur par défaut d'un type de valeur (et nullable est un type de valeur) n'est pas null, il n'est pas autorisé.


1 commentaires

Par défaut (Bool?) == (bool?) NULL, cependant.



1
votes

Lorsque vous appelez la méthode d'ajout sur le iList avec une valeur null, c'est une référence null que vous passez à la méthode, pas une valeur nullable. La référence NULL ne peut pas être convertie en une valeur nullable.

La méthode d'ajout attend quelque chose qui contient quelque chose qui contient un bool ou un bool? . Comme vous ne pouvez pas encadrer une valeur NULL, vous ne pouvez pas créer d'objet possible pour ajouter une valeur null au IList .

Si vous utilisez le générique Interface ilist à la place, il n'y a aucun problème à ajouter la valeur: xxx


1 commentaires

Malheureusement, dans ce cas, cela ne fonctionnera pas. Un exemple de ceci en action consiste à utiliser le nouvel JavasCriPTheSerializer (). Desérialisze > ("vrai, faux, null]")



0
votes

Comme il a été signalé, la mise en œuvre de l'implémentation de iList.add (élément d'objet) dans la liste code> classe 3.5 (et peut-être avant). La méthode iList.Add (objet) (élément d'objet) tente de vérifier que l'objet, nous essayons d'ajouter est un objet compatible avec la liste code> argument de type générique, qui échoue lorsque Nous essayons d'ajouter NULL à la liste des types de valeur nullables.

Ma solution de contournement implique la réflexion en obtenant et invoquant une méthode ADD (T item) à partir d'objet de liste. P>

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


0 commentaires