有没有办法将类型参数约束为引用类型或可空值类型?

时间:2010-07-08 13:15:54

标签: c# .net generics constraints nullable

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

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

然后我可以在引用类型上使用它(例如,objectstring以及可空值类型(例如int?,{{ 1}}):可以分配给double?的任何内容。但这是不可能的。

然后再说一遍,我知道,也许是这样?我知道没有null约束,就像我幻想的那样;但有没有一些解决方法或聪明的方法来实现这一点,但我没有想过?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

我认为这是一种函数,我真的会考虑使用输出参数和布尔返回类型编写函数,如下所示:

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

使用这种方法,不需要将通用参数限制为引用类型或可空类型。

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

答案 2 :(得分:0)

这取决于someConditionsomeCalculation方法中的通用用法。但这听起来像是可以使用'default'关键字。

return default(T);