【问题标题】:How to make a generic method allow returning null and accept enum?如何使泛型方法允许返回 null 并接受枚举?
【发布时间】:2011-09-04 09:36:55
【问题描述】:

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

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

    return (T)control.SelectedValue;
}

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

【问题讨论】:

标签: c# generics enums null


【解决方案1】:

返回一个 nullable 而不是普通的 T

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

    return (T)control.SelectedValue;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果他返回 default 而不是 null 怎么办?
    • @Tim,当然这会起作用,并且是编写此扩展方法的正确方法,但 OP 已经知道这一点,因为他在问题中提到了这一点。我只是试图向他解释,他试图编写的通用方法签名根本不存在。
    • @Darin:感谢您的回答,就我而言,康拉德回答的建议很有用。
    • @Darin 我刚刚重读了 OP 的问题,发现他不想使用默认值。无论如何,我很欣赏这个答案,因为我喜欢了解事情的“方式”,而不仅仅是它是否可以完成。
    【解决方案3】:

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

    【讨论】:

    • 是的,它很有用,我认为只需将0 分配给None 值并让扩展返回default(T) 就可以了
    • @French Boy:这简单易读,是解决这类问题的最自然方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多