我测试了这段代码并得知它没有编译。
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
为什么这段代码无效?
答案 0 :(得分:12)
不,它不有效。
的约束where TU : IE<T>
指的是当前 T
,即您正在调用此方法的类型。
考虑致电:
A<string>.Foo();
尝试将A<int>
作为TU
的类型参数传递,但约束意味着必须存在从TU
到IE<string>
的引用转换,因为T
是string
。
从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
。