捕获或抛出的类型必须从System.Exception派生

时间:2016-07-19 08:23:26

标签: c# generics

我是否需要在以下代码中使用约束来解决上述编译器错误:

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,但是我得到了上面的编译器错误。是否需要约束?

4 个答案:

答案 0 :(得分:0)

将方法更改为:

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

答案 1 :(得分:0)

是的,Exception语句要求类型派生自private T GetResponse<T, TError>(HttpResponseMessage response) where TError : Exception 。约束会解决这个问题。

.htaccess

答案 2 :(得分:0)

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

答案 3 :(得分:0)

编译时期间,ex实际 是一个异常并不清楚。编译器只知道它是TError类型,可能会也可能不会实现Exception。虽然在调用GetResponse<int, MyException>(response)时提供了类型,但编译器没有任何机会{@ 1}} 总是那个给定类型 - 所以中你的通用方法根本就没有关于那种类型的知识。如果您要编写类似TError的内容,编译器应该怎么做?

由于GetResponse<int, MyType>(response) - 语句需要throw的实例,因此您需要Excpetion的类型约束。