12

これに答えられるかもしれない人々がいると思います、これは好奇心からの質問です:

.NET v2で導入されたからのジェネリックCreateInstanceメソッドSystem.Activatorには、ジェネリック引数に型の制約はありませんが、アクティブ化された型にデフォルトのコンストラクターが必要です。そうでない場合は、MissingMethodExceptionがスローされます。私には、このメソッドには次のような型制約が必要であることは明らかです。

Activator.CreateInstance<T>() where T : new() {
   ...
}

ここに潜んでいる単なる省略またはいくつかの逸話?

アップデート

指摘したように、コンパイラはあなたが書くことを許可していません

private T Create<T>() where T : struct, new()
error CS0451: The 'new()' constraint cannot be used with the 'struct' constraint

ただし、コメントを参照してください。構造体は、new()制約を指定するジェネリックメソッドの型引数として使用できます。この状況下では、与えられた答えがメソッドを制約しない唯一の正当な理由のようです...

これを見てくれてありがとう!

4

1 に答える 1

8

私が間違っているかもしれませんが、主な利点は、次のようなことができることです。

// Simple illustration only, not claiming this is awesome code!
class Cache<T>
{
    private T _instance;

    public T Get()
    {
        if (_instance == null)
        {
            _instance = Create();
        }

        return _instance;
    }

    protected virtual T Create()
    {
        return Activator.CreateInstance<T>();
    }
}

制約Activator.CreateInstance<T>がある場合、上記のクラスにその制約が必要になることに注意してください。これは仮想メソッドであり、一部の派生クラスは、型の内部コンストラクターを呼び出したり、静的ビルダー メソッド。where T : new()Cache<T>Create

于 2011-03-03T23:30:14.940 に答える