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