web-dev-qa-db-fra.com

Rendre un type de valeur non nullable nullable

J'ai une structure simple qui a un usage limité. La structure est créée dans une méthode qui appelle les données de la base de données. S'il n'y a pas de données renvoyées par la base de données, je souhaite pouvoir renvoyer une valeur null, mais Visual Studio se plaint. Impossible de convertir une valeur null en packageName.StructName car il s'agit d'un type valeur non nullable.

Comment puis-je le rendre nul?

20
Malfist

Vous voulez examiner le type Nullable<T> value.

23
Andrew Hare
public struct Something
{
    //...
}

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

La définition d'une structure Nullable<T> est la suivante:

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

Il est créé de cette manière:

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

Vous pouvez raccourcir ce désordre en tapant simplement:

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

Voir: MSDN

6
John Rasch

Nullable<T> est une classe wrapper qui crée une version nullable du type T. Vous pouvez également utiliser la syntaxe T? (par exemple int?) pour représenter la version nullable du type T.

3
Orion Adrian

Utilisez les raccourcis intégrés pour la structure Nullable<T>, en ajoutant simplement ? à la déclaration:

int? x = null;

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

Même chose pour tout autre type, struct, etc.

MyStruct? myNullableStruct = new MyStruct(params);
2
Levit

Vous pouvez faire quelque chose de nullable par exemple comme ceci:

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

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

Vous pouvez utiliser default comme alternative

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

VelocityRange velocityRange = default (VelocityRange);

0
prakash yadav