返回 null 值

4

我在这个泛型类型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) 怎么样? - Uwe Keim
2
顺便说一句:为了保留原始异常的堆栈跟踪,你应该优先选择使用"throw;"而不是"throw ex;"。 - Uwe Keim
1
谢谢 @UweKeim,问题解决了。 - Nuno
1
这个问题已经得到了回答,但另一种可行的方法是抛出自定义异常,而不是返回任何内容。否则,调用者应该如何知道出了什么问题 - 他们需要检查每个值是否为 null 吗?如果 Tint,他们是否需要检查是否等于 0?如果 0 也是一个有效的值呢? - Jeroen Mostert
1
@UweKeim 我会的,谢谢。 - Nuno
https://www.bing.com/search?q=Returning+null+T - Alexei Levenkov
1个回答

6

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


4
另一个选项是对类的泛型类型设置约束。 - Derek Van Cuyk
太棒了...还有很多东西要学习 :) 谢谢! - Nuno
@DerekVanCuyk 很好的观点!已更新。 - David L
@DavidL 只检索类对象。我想我应该使用第二种方法。谢谢 ;) - Nuno
@Nuno 很高兴能帮忙! - David L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接