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

C# 有没有办法将类型参数约束为引用类型或可为空的值类型?,c#,.net,generics,constraints,nullable,C#,.net,Generics,Constraints,Nullable,如果我能定义这样一个方法,那就太好了: public T GetItem<T>() where T : null { if (someCondition<T>()) return someCalculation<T>(); else return null; } public T GetItem(),其中T:null { if(someCondition()) 返回someCalculation(); 其他的

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

public T GetItem<T>() where T : null
{
    if (someCondition<T>())
        return someCalculation<T>();
    else
        return null;
}
public T GetItem(),其中T:null
{
if(someCondition())
返回someCalculation();
其他的
返回null;
}
然后我可以在引用类型(例如,
对象
字符串
以及可为null的值类型(例如,
int?
double?
):任何可以分配给
null
的对象。但这是不可能的


再说一次,就我所知,也许是吧?我知道有一个no
null
约束,就像我想象的那样;但是,有没有一些解决方法或聪明的方法来实现这一点,我还没有想到呢?

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

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

return default(T);

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

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

public bool GetItem<T>(out T value)
{
    if (someCondition<T>())
    {
        value = someCalculation<T>();
        return true;
    }
    else
    {
        value = default(T);
        return false;
    }
}
public bool GetItem(out T值)
{
if(someCondition())
{
value=someCalculation();
返回true;
}
其他的
{
值=默认值(T);
返回false;
}
}
使用这种方法,无需将泛型参数限制为引用类型或可为null的类型


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

,我所关心的场景是,我希望能够根据返回值是否为
null
来区分成功与失败。例如,对于
int
default(int)
就是
0
,这可能是大量函数的有效返回值。@Dan,这种情况是有道理的。我可能会遵循TryParse模式——尽管我鄙视输出变量。我以为你很清楚“违约”,所以我的回答很傻。我自己也经常这么做。我想这是一个相当接近的替代方案,它抓住了我所问问题的精神,所以+1。既然这似乎是这个问题最明智的模式(无论如何,在我看来——我知道有很多人反对参数),我将继续接受这个答案。是的,我也经常这样做。但这需要给方法起不同的名字,这是令人沮丧的。