2009-02-27 5 views
19

У меня есть простая структура, которая имеет ограниченное использование. Структура создается в методе, который вызывает данные из базы данных. Если нет данных, возвращаемых из базы данных, я хочу иметь возможность возвращать нуль, но Visual Studio жалуется: Невозможно преобразовать null в имя PackageName.StructName, потому что это тип типа с нулевым значением.Создание типа с нулевым значением nullable

Как я могу сделать его допустимым?

ответ

10
public struct Something 
{ 
    //... 
} 

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

Насколько я понимаю, этот код не возвращает нуль, как хочет Малфист. –

+0

IIRC, это было предназначено как иллюстрация использования типов с нулевым значением, поскольку плакат, похоже, не понимал точно, какими они были. – mquander

+0

'default (Something)', возможно, было лучшим значением возврата по умолчанию в случае отсутствия значения. –

3

Nullable<T> является классом-оболочки, которая создает обнуляемую версию типа T. Можно также использовать синтаксис T? (? Например, целые), чтобы представить обнуляемую версию типа T.

6

Определения для 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

1

Вы могли бы сделать что-то обнуляемое, например, так:

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

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

Используйте встроенный ярлыков для Nullable<T> структуры, просто добавляя ? к объявлению:

int? x = null; 

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

Просто то же для любого другого типа, структуры и т. д.

MyStruct? myNullableStruct = new MyStruct(params); 
0

Вы можете использовать по умолчанию в качестве альтернативного

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

VelocityRange velocityRange = по умолчанию (VelocityRange);