【问题标题】:Is there any way to constrain a type parameter to EITHER a reference type OR a nullable value type?有没有办法将类型参数限制为引用类型或可为空的值类型?
【发布时间】:2010-07-08 13:15:54
【问题描述】:

如果我能定义这样的方法就好了:

public T GetItem<T>() where T : null
{
    if (someCondition<T>())
        return someCalculation<T>();
    else
        return null;
}

然后我可以将它用于引用类型(例如,objectstring以及可空值类型(例如,int?double?):任何可以分配给null。但这是不可能的。

再一次,据我所知,也许是这样?我知道没有null 约束,就像我刚刚幻想的那样;但是是否有一些我没有想到的解决方法或巧妙的方法来实现这一点?

【问题讨论】:

    标签: c# .net generics constraints nullable


    【解决方案1】:

    就个人而言,我会创建两个重载的泛型方法:一个接受引用类型,另一个接受可为空的值类型。然后你就可以使用任何一种参数调用。

    【讨论】:

    • 是的,我也经常这样做。但这需要给方法起不同的名字,这很令人沮丧。
    【解决方案2】:

    我以前从不使用输出参数,部分原因是我觉得语法很笨拙。然而,几年前我开始更多地使用它们,它们已经成为我编写的代码的一个共同方面。

    我认为这是我真正考虑编写带有输出参数和布尔返回类型的函数的类型,如下所示:

    public bool GetItem<T>(out T value)
    {
        if (someCondition<T>())
        {
            value = someCalculation<T>();
            return true;
        }
        else
        {
            value = default(T);
            return false;
        }
    }
    

    使用这种方法,您无需将泛型参数限制为引用类型或可为空的类型。

    正如我上面提到的,我最初觉得输出参数语法很笨拙,但是当我真正开始经常使用它之后,我觉得使用输出参数消耗我的函数的代码实际上更准确地表示了我正在尝试的问题解决,如果这有任何意义的话。

    【讨论】:

    • 我自己也经常这样做。我想这是一个相当接近的替代方案,它抓住了我所问的精神,所以 +1。
    • 因为这似乎是解决这个问题的最明智的模式(无论如何,在 my 看来——我知道有很多 out 参数反对者那里),我将继续接受这个答案。
    【解决方案3】:

    这取决于someConditionsomeCalculation 方法中的通用用法。但这听起来像是可以使用“默认”关键字的地方。

    return default(T);
    

    【讨论】:

    • 嗯,我关心的场景是,我希望能够根据返回值是否为null 来区分成功与失败。以int 为例,default(int) 只是0,它可能是多种函数的有效返回值。
    • @Dan,这种情况是有道理的。我可能会遵循 TryParse 模式——即使我鄙视输出变量。我以为你很清楚“默认”,所以我的回答很愚蠢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多