返回空 T [重复]
Posted
技术标签:
【中文标题】返回空 T [重复]【英文标题】:Returning null T [duplicate] 【发布时间】:2016-06-16 21:16:33 【问题描述】:我无法在此泛型类型 T 上返回 null。我尝试将其标记为 Nullable、Nullable 或 T?没有成功...
此方法是抽象类的一部分,我需要使其尽可能通用,以便检索任何类型的对象并从任何派生类中使用它。
public T GetFromApi<T>(string apiRequest, string content)
try
log.Debug("Requesting '" + apiRequest + "' from API with the following parameters: " + content);
_httpClient.DefaultRequestHeaders.Accept.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.DefaultRequestHeaders.Add("Authorization", string.Format("0 1", _token.token_type, _token.access_token));
var httpContent = new StringContent(content);
HttpResponseMessage response = _httpClient.GetAsync(apiRequest).Result;
if (response.IsSuccessStatusCode)
//Returns requested Object (T) from API
log.Info("Returning requested object " + typeof(T).ToString());
return response.Content.ReadAsAsync<T>().Result;
else
log.Error("Error accessing API.");
return null;
catch (Exception ex)
log.Fatal("Error accessing API.", ex);
throw ex;
else 语句上的 return null 给了我错误:
无法将 null 转换为类型参数 'T'
【问题讨论】:
返回default(T)
怎么样?
顺便说一句:您应该更喜欢 throw;
而不是 throw ex;
以保留原始异常的堆栈跟踪。
tnks @UweKeim.. 解决了...
问题已经得到解答,但另一种可行的方法是抛出自定义异常,而不是返回任何内容。否则,调用者应该如何知道出了什么问题——他们是否需要根据null
检查每个值?如果T
是int
,他们是否需要检查0
?如果0
也是有效值怎么办?
@UweKeim 我会的……谢谢
【参考方案1】:
如果传入的类型是结构,则 Null 可能不是 T
的可行值。
您可以改为返回 T
的默认类型,引用类型为 null:
else
log.Error("Error accessing API.");
return default(T);
如以下评论中所述,如果您将 T
限制为 class
,您也可以返回 null。
public T GetFromApi<T>(string apiRequest, string content) where T : class
...
else
log.Error("Error accessing API.");
return null;
但是,如果您确实需要检索原始类型(bool、int 等),您将无法再使用此方法。
【讨论】:
另一种选择是对类的泛型类型施加约束。 太棒了...还有很多东西要学:) 谢谢! @DerekVanCuyk 好点!已更新。 @DavidL 仅检索类对象。我想我应该使用第二种方法。谢谢;) @Nuno 乐于助人!以上是关于返回空 T [重复]的主要内容,如果未能解决你的问题,请参考以下文章