2013-04-09 51 views
2

這是我目前的方法,但我不時要處理這個問題,我想知道是否有更優雅的方法。將可爲空的參數傳遞給方法

我有: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 2013-04-09 12:10:52

+0

拋出可空值的異常究竟在哪裏? – thecoop 2013-04-09 12:11:04

+2

爲什麼當參數無效時檢查一個值?你不能只使用'if((byte)cboStatus.SelectedValue == 10 && IsUsedInProduction(LoadEntityId))' – Lee 2013-04-09 12:13:00

回答

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 2013-04-09 12:24:39

+0

@Leron歡迎您:) – 2013-04-09 12:26:00

0

我不是100%確定你在問什麼,但我想答案可能是?運營商:

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

這意味着,用於loadEntity的價值,如果它有一個,如果是null,則值-1來代替。

1

當你聲明:

private bool IsUsedInProduction(long? loadEntityId) 

其實是一樣的:

private bool IsUsedInProduction(Nullable<long> loadEntityId) 

所以,當你通過null的方法,創建一個空類型的對象,其中loadEntityId.HasValue等於falseloadEntityId.Value在調用時拋出異常,因爲沒有值。貝婁有一個合理使用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);