2016-11-03 1 views
1

begegnete mir nur eine seltsame Einschränkung während der Portierung in einem Konverter zu generischem Code explizit Code eingegeben:Warum wird Enum-Cast auf kurze, aber nicht gepackte Generic-Enum-Casts angewendet?

Wenn ein short (Int16) mit ihm möglich ist, es zu einem Aufzählungstyp zu werfen. Wenn Sie das Gleiche mit einem generischen Enum-Typ und einem Box-Cast tun ((T)(object)value), ist dies eine ungültige Konvertierung.

Ich konnte die Konvertierung durch Hinzufügen einer dritten Besetzung erfolgreich machen. Es sieht jetzt so aus:

Int16 numericValue; 
... 
var enumValue = (TEnum)(Object)(Int32)numericValue; 

Warum ist das? Der folgende (alte) Code funktionierte gut:

Int16 numericValue; 
... 
var enumValue = (MyEnum)numericValue;  
+1

Sie wissen sicher, dass der zugrunde liegende Typ von 'TEnum' wird' int' ('Int32')? Wenn der zugrunde liegende Typ "kurz" ("Int16") gewesen wäre, hätte Ihr erster Ansatz funktioniert. –

+0

es ist Standard, also wahrscheinlich int, aber ich sehe keinen Grund, warum ich es nicht zu kurz in meinem Fall ändern sollte –

+1

Sonst, hier sind einige andere hässliche Optionen für Sie, die unabhängig vom zugrunde liegenden Typ funktionieren sollten: ' var enumValue = (TEnum) Enum.ToObject (typeof (TEnum), numericValue) '' oder 'var enumValue = (TEnum) (dynamisch) numericValue;' –

Antwort

2

Dies ist ein Problem des Boxens und Unboxing. Wenn Sie das Objekt Unboxing, können Sie nur unbox auf den Typ des Wertes, der ursprünglich verpackt wurde: https://msdn.microsoft.com/de-de/library/yz2be5wk.aspx

In Ihrem Fall Kasten Sie ein Int16 zu einem Objekt:

Int16 numericValue; 
... 
var boxedValue = (object)numericValue; 

und dann versuchen, unbox es als Int32 (enum ist Int32), und dies ist nicht möglich:

var enumValue = (TEnum)boxedValue; // -> System.InvalidCastException 
+0

Danke für die Referenz, ich werde es mir ansehen –

+1

Eine leichte Korrektur: Eine Enumeration kann durch einen beliebigen Integraltyp unterstützt werden ('enum E: short {...}'). Der Standardwert, falls nicht angegeben, ist jedoch 'int'. Allgemeiner Code, der in der Lage sein muss, jedes alte 'Objekt' in ein altes' Enum' zu konvertieren, ist ziemlich eklig. –

+0

@Jeroen Mostert: Danke, das ist sehr hilfreich mit 'enum E: kurz ...' – Pearson

Verwandte Themen