Обнуляемые числа (??) и LinqToSQL - PullRequest
1 голос
/ 10 июня 2009

У меня есть следующее утверждение:

select new Action {
     ParentContentType = action.ParentContentType != null ? (ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType) : null 
};

ParentContentType - это обнуляемое перечисление типа ContentType

action.ParentContentType отображается в таблицу базы данных, которая может иметь значение null.

Если action.ParentContentType isnt null, значение enum определяется с помощью:

(ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType)

В случае, когда action.ParentContentType IS null Я пытаюсь установить для nullable перечисления значение null.

Это не компилируется, и я получаю:

Error   1 Type of conditional expression cannot be determined because there is no implicit conversion between ContentType' and '<null>' 

EDIT

Я мог создать нулевое значение перечисления .. т.е. ContentType.EMPTY.

Однако:

ParentContentType = action.ParentContentType == null? ContentType.EMPTY: (ContentType) Enum.ToObject (typeof (ContentType), action.ParentContentType) };

Также не работает!

Я получаю исключение:

The argument 'value' was the wrong type. Expected 'Enums.ContentType'. Actual 'System.Object'.

Ответы [ 3 ]

2 голосов
/ 10 июня 2009

Я бы согласился с вашей идеей ContentType.Null или ContentType.Empty, иначе вы будете проверять наличие нулей во всем приложении ... Плюс ContentType.Empty более наглядно.

1 голос
/ 10 июня 2009

Как ни странно:

ParentContentType = action.ParentContentType == null ? ContentType.EMPTY : (ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType) 

приводит к исключению:

The argument 'value' was the wrong type. Expected 'Enums.ContentType'. Actual 'System.Object'.

WTF

0 голосов
/ 10 июня 2009

null нетипизировано. Вы должны разыграть это явно, потому что? Оператор в C # требует, чтобы второй аргумент был того же типа (или неявно конвертируемым), что и первый.

Поскольку оба должны быть одного типа, а null не может быть приведен к типу значения, они оба должны иметь тип NULL:

select new Action {
  ParentContentType = action.ParentContentType != null ?
    (ContentType?)Enum.ToObject(typeof(ContentType), action.ParentContentType) :
    (ContentType?)null 
};

Однако это довольно неясно. Мне даже не приходило в голову, что вы можете создать обнуляемое перечисление (я думаю, вы можете, так как вы разместили вопрос - я никогда не пробовал).

Вам, вероятно, будет лучше с enum-значением, которое означает "ничего", как вы и предлагали. Это было бы менее удивительно для большинства разработчиков. Вы просто не ожидаете, что enum обнулится.

...