返回可为空的泛型类型的方法

时间:2017-09-06 20:43:25

标签: c# .net generics

这就是我要做的事情:

public T GetByID<T>(BaseAPI api)
{
    ....
    try
    {
        var response = (HttpWebResponse)httpRequest.GetResponse();
        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

        T returnObject = JsonConvert.DeserializeObject<T>(responseString);
        return returnObject;
    }
    catch (Exception ex)
    {
        return null;
    }
}

问题是return null行引发错误,我理解,因为T不可为空。所以,我试图让T可以为空,我不会搞清楚。无论我尝试什么,我都会得到这个:

  

类型'T'必须是非可空值类型才能在泛型类型或方法'Nullable'中将其用作参数'T'

我正在尝试各种形式:

public T? GetByID<T>(BaseAPI api)
{
    ....
    try
    {
        var response = (HttpWebResponse)httpRequest.GetResponse();
        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

        T? returnObject = JsonConvert.DeserializeObject<T?>(responseString);
        return returnObject;
    }
    catch (Exception ex)
    {
        return null;
    }
}

我已经看到其他一些线程提出了大致相同的问题,但是没有一个问题具体到足以让我一路走来。 This one真的很接近,但我找不到适合我的答案。

2 个答案:

答案 0 :(得分:1)

您需要在类级别设置通用约束

public class foo<T> where T : class

public T bar(){returns null;}现在将编译

编辑解释其工作原理

当您使用泛型时,编译器不知道它是什么类型。由于存在引用类型和非引用类型,因此您不能只返回null。因为T需要适用于引用类型和非引用类型。

通过声明一个约束,即T是一个类,你声明它是一个引用类型,因此可以返回null。

修改

根据评论,正确的方法是

default(T)

我将复制过去的原因并链接到问题

  

返回默认值(T),这意味着如果T是引用类型(或可空值类型),则返回null,0表示int,'\ 0'表示char等

original question

答案 1 :(得分:1)

要返回null,应将T标记为类并返回其默认值:

{{1}}
相关问题