2016-06-16 3 views
3

У меня возникли проблемы с возвратом null на этот общий тип T. Я пробовал маркировать его как Nullable, Nullable или T? без успеха ...Возврат null 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; 
    } 
} 

Возвращение нуль на утверждение еще дает мне ошибку:

Cannot convert null to type parameter 'T'

+0

Как насчет возврата 'default (T)'? –

+2

BTW: вы должны предпочесть 'throw;' over 'throw ex'', чтобы сохранить трассировку стека исходного исключения. –

+1

tnks @UweKeim .., который решает ... – Nuno

ответ

6

Null не может быть жизнеспособным значение для T если тип передается в это структура.

Вы можете вместо этого типа возврата по умолчанию для T, который для ссылочного типа является нулевым:

else 
{ 
    log.Error("Error accessing API."); 
    return default(T); 
} 

Как отмечено в комментарии ниже, вы можете альтернативно возвращать нулевое значение, если вы ограничите T к class.

public T GetFromApi<T>(string apiRequest, string content) where T : class 
... 
else 
{ 
    log.Error("Error accessing API."); 
    return null; 
} 

Однако, в том случае, если вам нужно получить потенциально примитивные тип (BOOL, INT, и т.д.), вы больше не будете иметь возможность потреблять этот метод.

+4

Другой вариант - установить ограничение на общий тип для класса. –

+0

awesome ... так много узнать еще :) Thnks! – Nuno

+0

@DerekVanCuyk замечательная вещь! Обновлено. –