2009-07-03 11 views
3

Je manipule les éléments dans une liste System.Management.ManagementObjectCollection. Chacun de ces éléments est un System.Management.ManagementObject qui contient les propriétés indexées par chaîne. Voir:Pourquoi ne puis-je pas extraire un ushort d'un objet System.Object, puis le transformer en uint? (C#)

foreach (ManagementObject queryObj in searcher.Get()) 
{ 
    string osversion = (string)queryObj["Version"]; 
    string os = (string)queryObj["Name"]; 
    uint spmajor = (uint)queryObj["ServicePackMajorVersion"]; 
    uint spminor = (uint)queryObj["ServicePackMinorVersion"]; 
    ... 
    ... 
    ... 
} 

Chaque « accès au dictionnaire » à queryObj retourne un C# object qui est en fait ce que la propriété est censé être - je dois connaître leur type « réel » au préalable, et c'est OK.

Le problème est, j'obtiens un InvalidCastException dans les moulages . Je dois utiliser le type réel, qui est ushort. Est-ce que la distribution de ushort à uint ne devrait pas être acceptable et évidente?

Dans ce cas, je vais éventuellement convertir les valeurs à string, mais si je devais les faire entrer dans uint ou int ou long des variables?

Répondre

18

Vous essayez de unbox un port, et il peut seulement être déballé à un port.

Une fois que vous l'avez déballé, vous pouvez le lancer comme d'habitude.

Toute valeur encadrée de type T ne peut être découplée que d'un T (ou d'un Nullable).

Eric Lippert a fait un très bon article sur ce sujet here.

+0

Il y a quelques exceptions à cela, en fait. Celui que je peux me rappeler immédiatement est que vous pouvez déballer une énumération avec un type "int" sous-jacent à int, et vice versa. J'ai été très surpris quand j'ai vu ça pour la première fois. –

+0

Haha, ouais ça sonne surprenant :-) Aussi, Eric a mentionné une autre exception à cette règle, c'est que vous pouvez lancer un Nullable. –

+0

Jon, je démontre probablement un manque de compréhension ici, mais est-ce que les Enums sont encaissés? Si ce n'est pas le cas, je dirais qu'ils ne contreviennent pas à cette règle, car elle ne s'applique qu'aux types encadrés. –

2

Le problème avec l'opérateur de casting est que cela signifie vraiment deux choses: lancer et convertir. Vous pouvez convertir une valeur d'un nombre en un nombre différent, mais vous ne pouvez pas convertir un nombre encadré en un type de nombre incorrect. Ainsi, ce que vous avez à faire à la place:

uint spmajor = (uint)(ushort)queryObj["ServicePackMajorVersion"]; 

Mieux encore:

uint spmajor = Convert.ToUInt32(queryObj["ServicePackMajorVersion"]);