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>エラー メッセージは、 の 2 番目の型引数を必要とする別の名前空間に別の名前空間が存在することを示すヒントである可能性がありますPerType<U, X??? >

于 2012-06-04T17:22:13.357 に答える