6

谁能解释为什么这不可能(至少在.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 的超类

编辑

我试图简化问题以使问题更清晰,但我显然做得过火了。对不起!

我想我的问题更具体一点。这是我的代码(基于):

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>' requires2' 类型参数

4

2 回答 2

8

实际上这是可能的。这段代码编译并运行得很好:

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>>();
}

不可能在泛型中使用协变/逆变,如下所述

IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;
于 2012-06-04T17:19:30.273 回答
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 的答案)。


错误消息可能是一个提示,告诉您在另一个命名空间中存在另一个Container<T>需要第二个类型参数的PerType<U, X??? >.

于 2012-06-04T17:22:13.357 回答