返回null T

时间:2016-06-16 21:16:33

标签: c# nullable return-type

我在这个泛型类型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语句的返回null给出了错误:

  

无法将null转换为类型参数&#39; T&#39;

1 个答案:

答案 0 :(得分:6)

如果传入的类型是结构,则空值可能不是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等),您将无法再使用此方法。