2

次のクラスがある場合:

class A
{
    public A(int number)
    {
    }
}

それでは、なぜ私はこのような汎用クラスを持つことができないのですか?

class B<ParameterClass> where ParameterClass : A
{
    public B()
    {
        ParameterClass a = new ParameterClass(1);
    }
}

CS0304を取得し、コンパイラはnew()制限がないと言っていますが、Aで定義されたコンストラクタを呼び出したいだけで、ParameterClassは常にAになるため、コンパイラはA(int番号)を確認できます。コンストラクターは常に存在します。なぜこの制限があるのか​​わかりません。

4

3 に答える 3

7

コンストラクターがで宣言されているからといって、で宣言されるAわけではありませんParameterClass。例えば:

public class Bad : A
{
    public Bad(string x) : base(x.Length)
    {
    }
}

今私は使用します:

var b = new B<Bad>();

あなたはそれが何をすることを期待しますか?あなたがそれを書いた方法、それ有効であるならば、私はそれが電話をかけようとすることを期待するでしょうnew Bad(1)、それは確かに有効ではありません。

于 2013-02-12T18:12:03.590 に答える
2

あなたはジェネリックを誤解しています。

ParameterClass常にになるとは限りませんA
むしろ、それは常にA またはを継承するタイプにAなります。

継承する型Aは、必ずしもと同じコンストラクターを持っているとは限りませんA

于 2013-02-12T18:11:53.443 に答える
0

where特定のメソッドがあることがわかるように、パラメータータイプを制限する句が必要です。Aを継承するクラスにはそのようなコンストラクターがない可能性があるため、この方法で構築することはできません。

where ParameterClass: A宣言内のと一緒にAのインスタンスをBのコンストラクターに渡すのはどうですか

于 2013-02-12T18:19:27.203 に答える