如何使泛型方法允许返回null并接受枚举?

时间:2011-09-04 09:36:55

标签: c# generics enums null

如何进行以下扩展工作?我将ComboBoxe绑定到枚举,在这种情况下它不会编译,因为它返回null

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

    return (T)control.SelectedValue;
}

注意:我希望它返回null(而不是默认值(T))。 问题是,我必须使用哪种表达方式?

3 个答案:

答案 0 :(得分:6)

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

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

    return (T)control.SelectedValue;
}

答案 1 :(得分:5)

那是不可能的。值类型不能为null。您的扩展方法返回T的实例,如果此T是枚举(值类型),则其值不能为null。因此,在不更改返回类型的情况下,此类方法签名根本不存在。至于将泛型参数约束为枚举,这在C#中也是不可能的,但在MSIL中是可能的。 Jon有blogged about it

答案 2 :(得分:1)

在这种情况下,最常见的方法是枚举定义None的所有其他成员,在这种情况下,在您的逻辑None == null中。