【问题标题】:Returning null T [duplicate]返回空 T [重复]
【发布时间】: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 检查每个值?如果Tint,他们是否需要检查0?如果0 也是有效值怎么办?
  • @UweKeim 我会的……谢谢

标签: c# nullable return-type


【解决方案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 乐于助人!
猜你喜欢
  • 2012-02-28
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2018-04-04
  • 1970-01-01
  • 2014-02-25
  • 2021-03-27
相关资源
最近更新 更多