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,但是约束意味着必须有从引用转换TU到IE<string>,因为T是string.
有没有转换,从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.