web-dev-qa-db-ja.com

null可能ではない値型をnull可能にする

使用が制限されている単純な構造体があります。構造体は、データベースからデータを呼び出すメソッドで作成されます。データベースからデータが返されない場合、nullを返せるようにしたいのですが、Visual Studioから問題があります。nullはnullにできない値型であるため、PackageName.StructNameに変換できません。

どうすればnullにできますか?

21
Malfist

Nullable<T> 値タイプ。

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

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

Nullable<T>構造体の定義は次のとおりです。

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

この方法で作成されます。

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

次のように入力するだけで、この混乱を回避できます。

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

参照: [〜#〜] msdn [〜#〜]

7
John Rasch

Nullable<T> は、T型のnull許容バージョンを作成するラッパークラスです。構文T?も使用できます。 (たとえば、int?)タイプNのnull許容バージョンを表します。

4
Orion Adrian

宣言にNullable<T>を追加するだけで、?構造体に組み込みのshortcutsを使用します。

int? x = null;

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

他のタイプ、構造体などでもまったく同じです。

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

たとえば、次のように何かをnull可能にできます。

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

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

代わりにdefaultを使用できます

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

VelocityRange velocityRange = default(VelocityRange);

1
prakash yadav