[英]Fun with generics: no implicit reference conversion error
我测试了这段代码并得到了它没有编译。
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>
约束where TU : IE<T>
但在这种情况下它不会影响,因为A<int>
是IE<T>
子类型。
而且它也很有趣,因为resharper建议将IE<T>
接口添加到A
为什么这段代码无效?
不,这不是有效的。 的约束
where TU : IE<T>
指的是当前的 T
,即您调用此方法的类型。
考虑一下:
A<string>.Foo();
那是试图将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>();
}
这现在有效,因为它根本不涉及T
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.