2016-07-19 47 views
0
衍生

我需要在下面的代碼約束來解決上述編譯器錯誤:捕獲或拋出的類型必須從System.Exception

private T GetResponse<T, TError>(HttpResponseMessage response) 
{ 
    if (response.IsSuccessStatusCode) 
    { 
     return response.Content.ReadAsAsync<T>().Result; 
    } 

    else 
    { 
     if (response.StatusCode == HttpStatusCode.BadRequest) 
     { 
      var ex = response.Content.ReadAsAsync<TError>().Result; 
      throw ex; 
     } 
    } 

    throw new NotImplementedException(); 
} 

我打電話上面如下:

public int MyMethod(string param) 
{ 
    var response = client.PostAsJsonAsync(url, param).Result; 
    return GetResponse<int, MyException>(response); 
} 

MyException確實派生自System.Exception,但是我得到了上述編譯器錯誤。是否需要約束?

+0

我也建議你避免使用Task.Result來阻塞線程,而是改用async方法。 –

+0

爲什麼不簡單地嘗試一下呢? – HimBromBeere

回答

0

更改方法:

private T GetResponse<T, TError>(HttpResponseMessage response) where TError : Exception 
0

是的,throw語句需要從Exception派生類型。約束會解決這個問題。

private T GetResponse<T, TError>(HttpResponseMessage response) 
    where TError : Exception 
0

在方法定義中添加where TError : Exception

0

編譯時 it's尚不清楚ex實際上例外。編譯器只知道它是TError類型,它可能會或可能不會實現Exception。雖然你打電話GetResponse<int, MyException>(response)時提供類型的編譯器沒有任何機會,TError給定類型的八方通 - 所以您的泛型方法有該類型沒有知識可言。編譯器應該做什麼,如果你要寫GetResponse<int, MyType>(response)之類的東西呢?

由於throw -statement期望Excpetion的實例,您需要一個類型約束TError,因爲您已經假定。

相關問題