使用泛型的乐趣:没有隐式引用转换错误

Ale*_*kiy 4 .net c# generics resharper

我测试了这段代码并得到了它没有编译.

interface IE<T>
{

}

class A<T> : IE<T>
{
    public static void F<TU>() where TU : IE<T>
    {

    }

    static void Foo()
    {
        F<A<int>>();
    }
}
Run Code Online (Sandbox Code Playgroud)

即使我添加它也会失败public static void F<TU>() where TU : A<int>, IE<T>.

afaik根据C#规范有效.如果我删除约束where TU : IE<T>但在这种情况下它不会影响,因为A<int>是子类型IE<T>.

它也很有趣,因为resharper建议添加IE<T>接口A在此输入图像描述

为什么这段代码无效?

Jon*_*eet 12

不,这不是有效的.的约束

where TU : IE<T>
Run Code Online (Sandbox Code Playgroud)

当前的 T,即您调用此方法的类型的当前值.

考虑一下:

A<string>.Foo();
Run Code Online (Sandbox Code Playgroud)

这是试图通过A<int>为一个类型的参数TU,但是约束意味着必须有从引用转换TUIE<string>,因为Tstring.

有没有转换,从A<int>IE<string>,因此它的破碎.基本上你对" A<int>亚型IE<T>"的期望对所有人来说都不是真的T.

现在您可以将其更改为:

public static void F<TU, TT>() where TU : IE<TT>
{
}

static void Foo()
{
    F<A<int>, int>();
}
Run Code Online (Sandbox Code Playgroud)

现在这是有效的,因为它根本不涉及T.