如何使泛型方法允许返回null并接受enum

本文关键字:null enum 返回 泛型方法 何使 许返回 | 更新日期: 2023-09-27 18:07:22

如何使下面的扩展工作?我将combobox绑定到enum,在这种情况下,它不会编译,因为它返回null

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

注意:我希望它返回null(而不是默认的(T))。问题是,我必须使用的where表达式是什么?

如何使泛型方法允许返回null并接受enum

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

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

那不可能。值类型不能为空。你的扩展方法返回一个T的实例,如果这个T是一个枚举(值类型),它的值不能为空。因此,如果不更改返回类型,这样的方法签名就不可能存在。至于将泛型参数约束为enum,这在c#中也是不可能的,但在MSIL中是可能的。

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