2015-09-10 19 views
7

Warum:String ist Nullable false zurück

string s = ""; 
bool sCanBeNull = (s is Nullable); 
s = null; 

sCanBeNull auf false gleichsetzen?

Ich schreibe einen Code-Generator und muss sicherstellen, dass jeder an ihn übergebene Typ nullfähig ist, wenn es nicht bereits vorhanden ist.

 //Get the underlying type: 
     var type = field.FieldValueType; 

     //Now make sure type is nullable: 
     if (type.IsValueType) 
     { 
      var nullableType = typeof (Nullable<>).MakeGenericType(type); 
      return nullableType.FullName; 
     } 
     else 
     { 
      return type.FullName; 
     } 

Muss ich explizit nach einer Zeichenfolge suchen müssen oder fehlt mir etwas?

+0

Does (s ist Nullable ); falsch zurückgeben? –

+3

Es gibt keine "Nullable ". 'Nullable ' ist für nullable ** Werttypen **. string ist ein Referenztyp. Und 'Nullable' ist eine statische Klasse –

+0

Funktioniert der zweite Teil des Codes nicht? Ich denke es sollte. Sie müssen jedoch berücksichtigen, dass der Typ möglicherweise ein Nullwerttyp sein kann. – usr

Antwort

6

is teilt Ihnen mit, ob ein Wert von einem bestimmten Typ ist oder von einem bestimmten Typ.

Nullable ist eine generische struct, die nullfähige Versionen von nicht nullbaren Werten ermöglicht.

string ist kein Nullable

zu sagen, ob ein Typ null Werte die Tatsache verwenden, dass für alle diese Typen der Standardwert ist null, während für alle anderen ist es nicht:

default(string) == null; // true 
+0

Nein, 'Nullable' ist nicht dasselbe wie' Nullable <> '. Ersteres ist eine ___static___ nicht generische 'Klasse', und letzteres ist eine generische' Struktur'. Wenn der Fragesteller "ist nullbar" ist, prüft er gegen eine statische Klasse und nichts kann eine Instanz einer statischen Klasse sein, also ist dies bedeutungslos. Unter dem neuen Roslyn-basierte C# 6.0-Compiler von Visual Studio 2015, wenn kompiliert mit "Feature strict", der Fehler bei der Kompilierung _Error \t CS7023 \t Der zweite Operand eines 'ist' oder 'as' -Operators möglicherweise nicht statischen Typ ' Nullable'_ wird ausgegeben. Auf der anderen Seite hat die Verwendung von 'is' mit' Nullable <> 'eine spezielle Interpretation. –

+0

Beispiel letzterer: 'Objekt o = 42;/* ... */var b = o ist int?; 'ist erlaubt und' b' ist 'true'. Diese Wahl wurde von den C# -Designern aufgrund der sehr speziellen Boxenregeln von 'Nullable <> getroffen. –

3

string ist ein Referenztyp, daher ist es nicht Nullable als reserviert für Werttypen.

In der Tat:

var nullable = new Nullable<string>(); 

Gibt einen Fehler zur Kompilierzeit.

Der Typ ‚string‘ muss einen Nicht-Nullable-Wertetyp sein, um es zu benutzen als Parameter ‚T‘ in der generischen Art oder Methode ‚System.Nullable‘

1

Die rationale hinter System.Nullable ist in der Lage, undefined Werttypen mit dem null Schlüsselwort darzustellen. Es bedeutet nicht, dass Sie überprüfen können, ob eine Variable mit someVar is Nullable auf null gesetzt werden kann.

Wenn bei der Kompilierung-Zeit können Sie nicht im Voraus wissen, ob eine Variable ein Wert-Typ oder ein Referenz-Typ sein würde, können Sie verwenden:

!someVar.GetType().IsValueType 

Aber in der Regel ein generisches Argument wäre ein besserer Ansatz sein.

0

Nullable ist nur eine normale class wie MyClass oder System.String (Nullable<T> ist struct obwohl).

Also, wenn Sie ein:

class _Nullable {} 

struct _Nullable<T> {} 

class Program 
{ 
    static void Main() 
    { 
     string a = ""; 
     Console.Write(a is _Nullable); 
    } 
} 

würden Sie nicht überrascht, wenn es false Recht zurückkehrt?

Wenn Sie überprüfen wollen, ob etwas NULL sein kann oder nicht, können Sie verwenden if(!(a is ValueType))

 string a = ""; 
     Console.Write("a is nullable = {0}", !(a is ValueType)); 

Ausgang: a is nullable = true