2013-04-09 6 views
2

Этот мой текущий метод, но время от времени мне приходится иметь дело с этой проблемой, и я хочу знать, есть ли более элегантный способ.Передайте аргумент nullable методу

У меня: long? LoadEntityId раздел. У меня есть метод, где я использую это в качестве аргумента:

private bool IsUsedInProduction(long? loadEntityId) 

Проблема заключается в том, что, когда LoadEntityId фактически нулевой я Nullable object must have a value.

Что мне теперь делать это:

if ((byte)cboStatus.SelectedValue == 10 
    && LoadEntityId.HasValue 
    && IsUsedInProduction(LoadEntityId.Value)) 

Но Я думаю, что должен быть лучший способ справиться с этой проблемой.

PS

Кажется, я не был достаточно ясно, в своем объяснении, так что проблема заключается в том, что если я:

if ((byte)cboStatus.SelectedValue == 10 
     && IsUsedInProduction(LoadEntityId.Value)) 

(удалить проверку LoadEntityId.HasValue), когда LoadEntityId фактически нулевой я получаю исключение , если я оставлю это, я просто ищу способ сделать мой код без этой проверки.

+2

Что случилось с этим кодом точно? – asawyer

+0

Где именно исключение вызывается об нулевом значении? – thecoop

+2

Почему вы проверяете значение, когда аргумент имеет значение NULL? Не можете ли вы просто использовать 'if ((byte) cboStatus.SelectedValue == 10 && IsUsedInProduction (LoadEntityId))' – Lee

ответ

5

вы используете правильный подход.

есть три варианта:

1) проверить loadEntityId.HasValue, а затем работать с loadEntityId.Value (то, что вы используете в настоящее время)

2) используют loadEntityId.GetValueOrDefault()

if ((byte)cboStatus.SelectedValue == 10 
    && IsUsedInProduction(loadEntityId.GetValueOrDefault())) 

3) использовать ?? Оператор

if ((byte)cboStatus.SelectedValue == 10 
    && (IsUsedInProduction(loadEntityId ?? 0)) 
+0

Спасибо , второй вариант идеально подходит для меня! – Leron

+0

@ Leron приветствуется :) –

0

Я не уверен на 100%, что вы просите, но я думаю, что ответ может быть? Оператор:

if(loadEntity ?? -1 > 0){...} 

Это означает, что значение loadEntity используется, если он имеет один, если это нуль, то значение -1 используется вместо этого.

1

При объявлении:

private bool IsUsedInProduction(long? loadEntityId) 

на самом деле так же, как:

private bool IsUsedInProduction(Nullable<long> loadEntityId) 

Итак, когда вы передаете null к методу, когда создается Nullable тип объекта, где loadEntityId.HasValue равна false и loadEntityId.Value throws и Exception при вызове, потому что это не значение. Ниже приведен пример разумного использования Nullable.Дополнительная информация: http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

Определение Пример:

private bool IsUsedInProduction(long? loadEntityId) 
{ 
    if(loadEntityId.HasValue) 
    { 
     //do something WITH loadEntityId.Value 
    } else 
    { 
     //do something 
    } 
} 

Вызывающие примеры:

IsUsedInProduction(null); 
IsUsedInProduction(21); 
IsUsedInProduction(23);