Создание необнуляемого типа значения обнуляемым - PullRequest
20 голосов
/ 27 февраля 2009

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

Как я могу сделать это обнуляемым?

Ответы [ 7 ]

23 голосов
/ 27 февраля 2009

Вы хотите просмотреть тип значения Nullable<T>.

11 голосов
/ 27 февраля 2009
public struct Something
{
    //...
}

public static Something GetSomethingSomehow()
{
    Something? data = MaybeGetSomethingFrom(theDatabase);
    bool questionMarkMeansNullable = (data == null);
    return data ?? Something.DefaultValue;
}
6 голосов
/ 27 февраля 2009

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

4 голосов
/ 27 февраля 2009

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

2 голосов
/ 09 мая 2016

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

int? x = null;

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

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

MyStruct? myNullableStruct = new MyStruct(params);
1 голос
/ 16 мая 2016

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

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

VelocityRange SpeedRange = По умолчанию (VelocityRange);

1 голос
/ 20 января 2013

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

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

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