为什么约束返回类型需要显式转换?

时间:2016-12-09 04:06:28

标签: c# generics polymorphism

为什么这样的方法需要显式转换返回类型?

    public T Test<T> ()
        where T : Response
    {
        var ret = new Response ();

        return ret; // Explicit cast needed here
    }

约束明确指出T是Response或它的子节点,因此返回类型多态性应该允许这种情况而不进行强制转换,或者我认为是这样。

添加as T允许编译通过。

2 个答案:

答案 0 :(得分:4)

TResponse的子类,意味着每个T都是Response,但不是每个Response都是T。这就是你需要一个明确的演员。

答案 1 :(得分:2)

对于返回值,T是否为Response类型无关紧要。您需要返回T类型的内容。

考虑类型DerivedFromResponse。使用您的方法Test<DerivedFromResponse>()将返回null与演员阵容,如果没有它,将无法正常工作,因为您无法将Response投射到DerivedFromResponse中(反之亦然)可能的)。

希望它有所帮助。