C#泛型:在方法泛型的where子句中使用类泛型

时间:2012-06-04 17:11:00

标签: c# generics .net-2.0

任何人都可以解释为什么这不可能(至少在.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'类型参数

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??? >的第二个类型参数。