C# 泛型的乐趣:没有隐式引用转换错误
我测试了这段代码,发现它无法编译C# 泛型的乐趣:没有隐式引用转换错误,c#,.net,generics,resharper,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>>(); } } 接口IE { } A类:即 { 公共静态无效F(),其中
interface IE<T>
{
}
class A<T> : IE<T>
{
public static void F<TU>() where TU : IE<T>
{
}
static void Foo()
{
F<A<int>>();
}
}
接口IE
{
}
A类:即
{
公共静态无效F(),其中TU:IE
{
}
静态void Foo()
{
F();
}
}
即使我在TU:A的位置添加了公共静态void F(),它也会失败
根据C#规格,它是有效的。如果我删除containtwhere TU:IE
,但在本例中它不会影响,因为A
是IE
的子类型
这也很有趣,因为resharper建议将IE
接口添加到A
为什么此代码无效?不,它无效。约束
where TU : IE<T>
这试图将A
作为TU
的类型参数传递,但约束意味着必须有从TU
到IE
的引用转换,因为T
是string
没有从A
到IE
的转换,因此它被破坏了。基本上,你对“A
是IE
的子类型”的期望并不适用于所有t
现在您可以将其更改为:
public static void F<TU, TT>() where TU : IE<TT>
{
}
static void Foo()
{
F<A<int>, int>();
}
publicstaticvoidf(),其中TU:IE
{
}
静态void Foo()
{
F();
}
这现在是有效的,因为它根本不涉及t
public static void F<TU, TT>() where TU : IE<TT>
{
}
static void Foo()
{
F<A<int>, int>();
}