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

C# 如何使泛型方法允许返回null并接受enum?,c#,generics,enums,null,C#,Generics,Enums,Null,如何使以下扩展工作?我将ComboBox绑定到一个枚举,在本例中,它不会编译,因为它返回null public static T GetSelectedValue<T>(this ComboBox control) { if (control.SelectedValue == null) return null; return (T)control.SelectedValue; } public static T GetSelectedValue(

如何使以下扩展工作?我将ComboBox绑定到一个枚举,在本例中,它不会编译,因为它返回
null

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

    return (T)control.SelectedValue;
}
public static T GetSelectedValue(此组合框控件)
{
if(control.SelectedValue==null)
返回null;
返回(T)控件。选择值;
}

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

这是不可能的。值类型不能为null。扩展方法返回
T
的实例,如果此T是枚举(值类型),则其值不能为null。因此,如果不更改返回类型,这种方法签名就不可能存在。至于将泛型参数约束为枚举,这在C#中也是不可能的,但在MSIL中也是可能的。Jon返回了一个可为空的而不是普通的
T

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

    return (T)control.SelectedValue;
}
publicstatict?GetSelectedValue(此组合框控件),其中T:struct
{
if(control.SelectedValue==null)
返回null;
返回(T)控件。选择值;
}

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

下面的帖子回答了您关于从泛型方法返回null的问题:如果他返回的是默认值而不是null呢?@Tim,当然,这将起作用,并且是编写此扩展方法的正确方法,但是OP已经知道这一点,因为他在问题中提到了它。我只是试图向他解释,他试图编写的泛型方法签名根本不存在。@Darin:谢谢你的回答,在我的情况下,Konrad回答的建议很有用。@Darin我只是重读了OP的问题,发现他不想使用默认值。不管怎么说,我很欣赏这个答案,因为我喜欢理解事情的“如何”,而不仅仅是它是否可以完成。是的,它很有用,我认为只需将
0
赋值给
None
值并让扩展返回
default(t)
@French Boy:这既简单又可读,所以这是解决这类问题最自然的方法。
public static T GetSelectedValue<T>(this ComboBox control)
{
    if (control.SelectedValue == null)
        return null;

    return (T)control.SelectedValue;
}