2009-02-27 18 views
19

Ich habe eine einfache Struktur, die nur begrenzt verwendet werden kann. Die Struktur wird in einer Methode erstellt, die die Daten aus der Datenbank aufruft. Wenn keine Daten von der Datenbank zurückgegeben werden, möchte ich eine Null zurückgeben können, aber Visual Studio beschwert sich. Kann NULL nicht in PackageName.StructName konvertieren, da es sich um einen nicht nullbaren Werttyp handelt.Erstellen eines nicht nullbaren Werttyps nullwert

Wie kann ich NULL-Werte machen?

Antwort

10
public struct Something 
{ 
    //... 
} 

public static Something GetSomethingSomehow() 
{ 
    Something? data = MaybeGetSomethingFrom(theDatabase); 
    bool questionMarkMeansNullable = (data == null); 
    return data ?? Something.DefaultValue; 
} 
+1

Soweit ich verstehe, gibt dieser Code nicht Null zurück, wie Malfist will. –

+0

IIRC, war es als eine Illustration der Verwendung von Nullable-Typen gedacht, da das Poster nicht genau zu verstehen schien, was sie waren. – mquander

+0

'default (Something)' könnte ein besserer Standard-Rückgabewert gewesen sein, falls kein Wert existiert. –

3

Nullable<T> ist eine Wrapper-Klasse, die eine Nullable-Version des Typs T. schafft Sie auch die Syntax T verwenden kann? (? ZB int) die Nullable-Version des Typs T. darzustellen

6

Die Definition für eine Nullable<T> Struktur ist:

struct Nullable<T> 
{ 
    public bool HasValue; 
    public T Value; 
} 

Es wird auf diese Weise erstellt:

Nullable<PackageName.StructName> nullableStruct = new Nullable<PackageName.StructName>(params); 

Sie können Verknüpfung dieses Chaos, indem Sie einfach Folgendes eingeben:

PackageName.StructName? nullableStruct = new PackageName.StructName(params); 

See: MSDN

1

Sie könnten etwas nullable zum Beispiel so machen:

// Create the nullable object. 
int? value = new int?(); 

// Check for if the object is null. 
if(value == null) 
{ 
    // Your code goes here. 
} 
1

Über die eingebaute in Verknüpfungen für die Nullable<T> Struktur, indem man einfach ? auf die Erklärung und fügte hinzu:

int? x = null; 

if (x == null) { ... } 

Nur das gleiche gilt für jede andere Art, Struktur usw.

MyStruct? myNullableStruct = new MyStruct(params); 
0

Sie können Standard als Alternative

public struct VelocityRange 
{ 
    private double myLowerVelocityLimit; 
    private double myUpperVelocityLimit; 
} 

VelocityRange velocityRange = Standard (VelocityRange) verwenden;