3

だから私は次のように内部にラッパークラスを持つクラスを持っています:

public class RandomClass<TK, TV>
{
    internal class RandomClassWrapper<TK, TV> : RandomClass<TK, TV> {}
}

これは、RandomClassWrapperがnewキーワードを使用して、RandomClassの一部のメソッドの動作をオーバーライドしているためです。これは、ライブラリがこれらの関数にアクセスできるようにしたいだけだからです。

また、RandomClassのいくつかのプライベート変数を変更する必要があるため、ネストされています。

しかし、これを初期化したいときは、行かなければなりません

var rc = new RandomClass<int, int>.RandomClassWrapper<int, int>();

なぜそれが最初に<int, int>必要なのですか?なぜこのように書くことができなかったのですか?

var rc = new RandomClass.RandomClassWrapper<int, int>();

<int, int>次のようなものに変わる可能性のある余分なものを入力する必要がないようにする方法はありますか?<Dictionary<string, nameofclass>, List<thisistoolong>>

それは誇張ですが、あなたは私が何を意味するのか理解しています。これらのタイプを2回配置しなければならないことは、スペースの大きな浪費です。

誰かが別のアプローチを提案できますか?

これは質問を少し明確にするのに役立つので、次の2つのコメントに注意を向けます。

それで、あなたの質問は「なぜコンパイラはRandomClassへの引数からRandomClassWrapperへの一般的な引数を推測できないのですか?– EdS.3分前

@EdS。それは質問の1つの要素です、はい。もう1つは、次のとおりです。できないので、これをクリーンアップして、一般的な引数を2回入力する必要をなくすことができる代替のアプローチ/ハックはありますか。–今すぐcaesay

4

1 に答える 1

5

2番目のクラスは外部ジェネリッククラス内にネストされているため、型を再指定する必要はありません。

internal class RandomClassWrapper : RandomClass<TK, TV> {}

正しくコンパイルする必要がある場合は、ネストされたクラスが自動的に型を共有するため、ジェネリックの1つのセットを指定する必要があります。

var rc = new RandomClass<int, int>.RandomClassWrapper();

理解する必要があるのは、内部では、ジェネリック型のさまざまなセットごとにコンパイラーによって新しいクラス定義が生成されるということです(言い回しが悪いと思います)。この意味は

RandomClass<int, int>はすでにとは異なる定義RandomClass<string, string>であるため、その内部ネストされたクラスもすでに別の汎用定義に含まれています。

于 2012-06-25T05:08:49.250 に答える