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

时间:2015-01-22 16:03:20

标签: c# .net 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>>();
    }
}

即使我添加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 enter image description here

为什么这段代码无效?

1 个答案:

答案 0 :(得分:12)

不,它有效。

的约束
where TU : IE<T>

指的是当前 T,即您正在调用此方法的类型。

考虑致电:

A<string>.Foo();

尝试将A<int>作为TU的类型参数传递,但约束意味着必须存在从TUIE<string>的引用转换,因为Tstring

A<int>IE<string>没有转换,因此它被破坏了。基本上你对&#34; A<int>的期望是IE<T>&#34;的子类型。所有T都不是真的。

现在您可以将其更改为:

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

static void Foo()
{
    F<A<int>, int>();
}

现在有效,因为它根本不涉及T