这就是我要做的事情:
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真的很接近,但我找不到适合我的答案。
答案 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等
答案 1 :(得分:1)
要返回null,应将T标记为类并返回其默认值:
{{1}}