2012-11-22 21 views
5

Ich kann nicht glauben, dass ich das nicht googlen kann. Ich weiß nicht, was ich googeln soll.C#: Überprüfen Sie, ob Typ T bool ist

public static T GetValue<T>(T defaultValue) 
{ 
    if (T is bool) // <-- what is the correct syntax here? 
    return (T)true; // <-- I don't think this works either 
} 

EDIT: Sorry, ich nicht erwähnt, über die Funktion ist nur meine Frage zu zeigen. Es ist keine echte Funktion. Danke allen für die Antworten!

+0

Suchen Sie nach den Compiler-Fehlern. Ich bin mir sicher, dass es viele Duplikate gibt. Zumindest * fügen Sie * [Compiler] -Fehler in Fragen ein, falls zutreffend. –

Antwort

10

Wenn man muss verwendet diese gleiche Methode/Unterschrift und muss verwenden, um die Art von T (und es ist Grund für eine solche, aber wenn es nicht dann Albin Antwort sehen):

public static T GetValue<T>(T defaultValue) 
{ 
    // Need to use typeof to get a Type object for bool, just as with T 
    if (typeof(T) == typeof(bool)) { 
    // Need to say "get out of my way C#" 
    // The first cast to object is required as true (bool) is 
    // otherwise not castable to an unrestricted T. 
    // This widen-restrict approach could result in a cast error, 
    // but from the above check it is known that T is bool. 
    return (T)(object)true; 
    } 
    // .. other stuff that .. does stuff. 
} 

Allerdings explizit true (was ist nicht der Standardwert für einen Boolean) und Ignorieren defaultValue ganz anders scheint .. suspect. Aber - It compiles! Ship it!

Hinweise:

  • Die Verwendung == für Typen werden nicht zuverlässig für Unterklassen (aber es ist in Ordnung, weil bool eine Struktur ist so Subtypen kein Thema ist). Sehen Sie sich in diesen Fällen IsAssignableFrom an.
  • typeof(T) ist nicht unbedingt der Typ des übergebenen Werts (der für Referenztypen null sein könnte). Dies kann zusammen mit Subtypen zu subtilen Variationen von Ansätzen führen, die is für den Wert verwenden.
+0

+1, um das Problem dieser Lösung für Subtypen anzuzeigen. Ich habe einmal Stunden mit einem solchen Thema verbracht. – Guillaume

7

Sie den Typ nicht überprüfen, überprüfen Sie die Variable

public static T GetValue<T>(T defaultValue) 
{ 
    if (defaultValue is bool) // <-- what is the correct syntax here? 
    return (T)true; 
} 

Aber nur als Neben nicht, wenn Sie die Typprüfung tun und haben unterschiedliche Handhabung für verschiedene Typen in einer generischen Art tun Sie in der Regel etwas nicht in Ordnung .

Warum erstellen Sie keine Überladung für die Typen mit besonderer Handhabung?

public static bool GetValue(bool defaultValue) 
{ 
    return true; 
} 
+0

Ah, danke, aber ich habe diese Funktion, die bereits funktioniert für alle string/int/double/float/decimal außer bool – Aximili

+2

'(T) wahr' funktioniert nicht, natürlich – horgh

3

Vielleicht suchen Sie nach default(T), die den Standardwert für bereitgestellten Typ zurückgibt. Der Standardwert für bool ist false.

+1

+1: Schöne Annahme! – horgh

Verwandte Themen