2011-09-04 43 views
6

如何進行以下擴展工作?我將ComboBoxe綁定到一個枚舉,在這種情況下它不會編譯,因爲它返回null如何使泛型方法允許返回null並接受枚舉?

public static T GetSelectedValue<T>(this ComboBox control) 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 

注意:我希望它返回null(而不是默認(T))。 問題是,我必須使用何種表達方式?

+0

下面的帖子回答你關於從泛型方法返回null的問題:http://stackoverflow.com/questions/302096/how-can-i-return-null-from-a-generic-method-in-c – Waqas

回答

5

返回一個可空的,而不是一個普通的T

public static T? GetSelectedValue<T>(this ComboBox control) where T : struct 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 
5

這是不可能的。值類型不能爲空。你的擴展方法返回一個T的實例,如果這個T是一個枚舉(值類型),它的值不能爲空。所以不改變你的返回類型,這種方法簽名根本就不存在。至於限制泛型參數是一個枚舉,這在C#中也是不可能的,但在MSIL中可能。喬恩有blogged about it

+0

什麼如果他返回默認而不是null? – Tim

+0

@Tim,當然這會工作和寫這個擴展方法的正確方法,但OP已經知道這一點,因爲他在他的問題中提到它。我只是試圖向他解釋他所寫的通用方法簽名根本無法存在。 –

+0

@Darin:感謝您的回答,就我而言,Konrad回答的建議很有用。 –

1

在這種情況下,最常見的方法是你列舉的所有其他成員之間在邏輯None == null定義None,在這種情況下。

+0

是的,這很有用,我認爲只需將'0'賦予'None'值並讓擴展返回默認值(T)就可以了# –

+0

@法國男孩:這很簡單易讀,所以最自然的解決方法是有些問題。 – Tigran

相關問題