2017-12-31 32 views
8

Ich verwendete die Enum.IsDefined() Methode für eine Zeichenfolge, aber ich bekomme False in einer Situation, in der ich denke, ich sollte True bekommen. Bitte überprüfen Sie den Code unten:Enum.IsDefined gibt false für Strings zurück

public enum YourEnum : int 
{ 
    Zero = 0, 
    One = 1 
} 

public class Program 
{ 

    public static void Main(string[] args) 
    { 
     Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1)); 
     Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1.ToString())); 
    } 
} 

C# Fiddle Demo
Ergebnis:

True 
False 

Ich weiß nicht, warum sollte ich False im zweiten Fall bekommen. Jede Hilfe wird geschätzt.

+1

Das ist 'Enum.Parse()', das 'string' akzeptiert. 'Enum.IsDefined()' vergleicht die * Konstanten *, die in Ihrer 'enum' definiert sind, mit dem, was Sie übergeben. – haim770

+0

In dieser Antwort ist ja das nicht so auf meine Hauptfrage bezogen, tatsächlich akzeptiert' Enum.IsDefined' 'object' als zweiter Parameter, sollte ich fragen, ob Do 'IsDefined' auch den Typ des zweiten Parameters überprüft? –

Antwort

19

Wenn Sie eine Zeichenfolge an die Methode IsDefined() übergeben, fragen Sie, ob in der Enumeration mit dem Namen ein Wert vorhanden ist. The documentation lautet:
• Jedes Mitglied des Typs enumType:

Der Wert Parameter einer der folgenden sein kann.
• Eine Variable, deren Wert ein Aufzählungsmember vom Typ enumType ist.
Die Zeichenfolgendarstellung des Namens eines Enumerationselements. Die Zeichen in der Zeichenfolge müssen den gleichen Fall wie der Name des Aufzählungselements haben.
• Ein Wert des zugrunde liegenden Typs von enumType.

(Hervorhebung von mir)

Es ist ein wenig verwirrend ist, zu lesen, weil die ersten, zweiten und vierten Optionen vor allem Ergebnis in der gleichen Sache: ein Wert der Aufzählungstyp übergeben wird (geboxt, von Kurs).

Aber die dritte Option ist, was in Ihrem Szenario passiert, und die Zeichenfolge muss die Name eines Aufzählungsmember entsprechen. Sie übergeben die Zeichenfolge "1", und die einzigen gültigen Namen in der Enumeration sind "Zero" und . Die Zeichenfolge "1" passt nicht zu diesen beiden Zeichen. Daher gibt IsDefined()false zurück.

5

Wenn Sie eine Zeichenfolge als Argument übergeben, wird geprüft, ob einer der Namen der Enumeration der angegebenen Zeichenfolge entspricht.

Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1)); 
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), "Zero")); 

Siehe source code (line 1503) für mehr: Im Folgenden wird für beide true zurück. Davon abgesehen, ist es besser, diese Informationen aus der Dokumentation abzuleiten, wie @Peter Dunihos Antwort gezeigt hat, da sich die Implementierung ändern kann. Aber trotzdem, wenn Sie neugierig sind, ist der Quellcode da.