返回空 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 检查每个值?如果Tint,他们是否需要检查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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

返回一个空向量c ++ [重复]

我的 ObjectType 正在返回一个空对象 [重复]

MongoDB $lookup 返回空数组[重复]

MongoDB $lookup 返回空数组[重复]

即使在使用 Incude 之后,EF 核心导航属性也会返回空值

Mongodb.find返回空数组[重复]