Frage Wenn Sie einen nicht nullbaren Wert eingeben, können Sie den Wert null eingeben


Ich habe eine einfache Struktur, die nur begrenzt benutzt 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.

Wie kann ich NULL-Werte festlegen?


19
2018-02-27 18:32


Ursprung


Antworten:


Du willst in die schauen Nullable<T> Werttyp.


22
2018-02-27 18:34



public struct Something
{
    //...
}

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

10
2018-02-27 18:37



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

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

Es ist auf diese Weise erstellt:

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

Sie können dieses Chaos abkürzen, indem Sie einfach Folgendes eingeben:

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

Sehen: MSDN


6
2018-02-27 18:42



Nullable<T> ist eine Wrapperklasse, die eine Nullable-Version vom Typ T erstellt. Sie können auch die Syntax T? (z.B. int?), um die Nullable-Version des Typs T darzustellen.


3
2018-02-27 18:38



Du könntest zum Beispiel so etwas nullable machen:

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

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

1
2018-01-20 01:04



Verwenden Sie das integrierte Verknüpfungen für die Nullable<T> Struktur, indem einfach hinzugefügt wird ? zur Erklärung:

int? x = null;

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

Genauso für jeden anderen Typ, Struktur usw.

MyStruct? myNullableStruct = new MyStruct(params);

1
2018-05-09 07:18



Sie können verwenden Standard als Alternative

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

VelocityRange velocityRange = Standard(VelocityRange);


0
2018-05-16 05:48