任何人都可以解释为什么这不可能(至少在.Net 2.0中):
public class A<T>
{
public void Method<U>() where U : T
{
...
}
}
...
A<K> obj = new A<K>();
obj.Method<J>();
K是J的超类
修改
我试图简化问题以使问题更清晰,但我显然已经过度了。遗憾!
我猜我的问题更具体一点。这是我的代码(基于this):
public class Container<T>
{
private static class PerType<U> where U : T
{
public static U item;
}
public U Get<U>() where U : T
{
return PerType<U>.item;
}
public void Set<U>(U newItem) where U : T
{
PerType<U>.item = newItem;
}
}
我收到了这个错误:
Container.cs(13,24):错误CS0305:使用泛型类型
Container<T>.PerType<U>' requires
2'类型参数
答案 0 :(得分:7)
实际上这是可能的。这段代码编译并运行得很好:
public class A<T>
{
public void Act<U>() where U : T
{
Console.Write("a");
}
}
static void Main(string[] args)
{
A<IEnumerable> a = new A<IEnumerable>();
a.Act<List<int>>();
}
正如在here所解释的那样,在泛型中使用协方差/逆变是不可能的:
IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;
答案 1 :(得分:2)
它对我有用(VS 2008)。
您对班级可见性有疑问吗? (类不公开,命名空间错误)
您收到了哪条错误消息?
<强>更新强>
鉴于您Container<T>
的实施,我可以写
class A { }
class B : A { }
class Test
{
public void MethodName( )
{
var obj = new Container<A>();
obj.Set(new B());
}
}
这完美无缺。您确定B
来自A
吗?请注意,例如List<B>
并非来自List<A>
(请参阅YavgenyP&#39})。
错误消息可能是一个提示,告诉您另一个命名空间中存在另一个Container<T>
,需要PerType<U, X??? >
的第二个类型参数。