捕获或引发的类型必须从System.Exception派生
本文关键字:System Exception 派生 类型 | 更新日期: 2023-09-27 17:57:32
以下代码中是否需要约束来解决上述编译器错误:
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
派生的,但是我得到了上面的编译器错误。是否需要约束?
将方法更改为:
private T GetResponse<T, TError>(HttpResponseMessage response) where TError : Exception
是的,throw
语句要求类型从Exception
派生。约束可以解决这个问题。
private T GetResponse<T, TError>(HttpResponseMessage response)
where TError : Exception
将where TError : Exception
添加到方法定义中。
在编译时,不清楚ex
是否真的是异常。编译器只知道它是TError
类型,它可以实现也可以不实现Exception
。尽管您在调用GetResponse<int, MyException>(response)
时提供了类型,但编译器不可能使TError
在所有方面都是该给定类型的,因此在的泛型方法中根本不知道该类型。如果你要写GetResponse<int, MyType>(response)
之类的东西,编译器应该怎么做?
由于throw
-语句需要Excpetion
的实例,您将需要TError
的类型约束,正如您已经设想的那样。