2009-02-27 8 views
19

Mam prostą strukturę, która ma ograniczone zastosowanie. Struktura jest tworzona w metodzie, która wywołuje dane z bazy danych. Jeśli nie ma danych zwróconych z bazy danych, chcę mieć możliwość zwrócenia wartości zerowej, ale program Visual Studio narzeka, Nie można przekonwertować wartości null na NazwaPakietu.NazwaStruktu, ponieważ jest to typ wartości nienależący do wartości null.Wprowadzanie wartości niemożliwej do zniesienia zerowania

Jak mogę sprawić, by było to zerowalne?

Odpowiedz

10
public struct Something 
{ 
    //... 
} 

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

O ile rozumiem, kod ten nie zwraca wartości null, jak chce Malfist. –

+0

IIRC, miało to być ilustracją użycia typów nullable, ponieważ plakat nie rozumiał dokładnie, czym one były. – mquander

+0

'default (Something)' może być lepszą domyślną wartością zwracaną w przypadku, gdy żadna wartość nie istnieje. –

3

Nullable<T> jest klasy otoki, który tworzy zerowalne wersję typu T. Można także użyć składni T? (? Np int) do reprezentowania zerowalne wersję typu T.

6

Definicja dla Nullable<T> struct jest:

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

Jest on stworzony w ten sposób:

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

Można skrót ten bałagan, po prostu wpisując:

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

Zobacz: MSDN

1

Można zrobić coś zerowalne na przykład tak:

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

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

pomocą wbudowanej skrótów dla Nullable<T> struktury, poprzez dodanie ? do deklaracji:

int? x = null; 

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

Wystarczy to samo dla każdego innego typu, struktury itp.

MyStruct? myNullableStruct = new MyStruct(params); 
0

Można użyć domyślne jako alternatywny

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

VelocityRange velocityRange = domyślnej (VelocityRange);

Powiązane problemy