4


0

型をデリゲートに制限できますか

型をクラスまたは構造体に制限できます。 型をデリゲートに制限できますか?

2 Answer


9


`Delegate`はクラスであり、通常は非密閉クラスを制約として指定できます。 ただし、言語仕様では、セクション10.1.5で有効な制約として「System.Delegate」を明確に除外しています。

_ _ _class-type_制約は、次のルールを満たしている必要があります。

  • 型はクラス型でなければなりません。

  • 密閉してはいけません。

  • 型は、System.Array、System.Array、 System.Delegate、System.Enum、またはSystem.ValueType。

  • 型はオブジェクトであってはいけません。 すべてのタイプはオブジェクトから派生するため、 そのような制約は、許可されていれば効果がありません。

  • 特定の型パラメータに対する最大1つの制約をクラス型にすることができます。 _ _


2


既に指摘したように、C#仕様では「デリゲート」の一般的な制約を許可していません。 また、コンパイラは汎用の制約として「デリゲート」サブクラスを受け入れません。 最善の方法は、テストして例外をスローすることです。 これをメソッドで示しますが、これがジェネリッククラスである場合、コンストラクターはチェックを行うのに最適な場所です。

public void Foo(T x)
{
    if (x == null)
        throw new ArgumentNullException("x");

    Delegate d = x as Delegate;
    if (d == null)
        throw new ArgumentException("Argument must be of Delegate type.", "x");

    // Use d here.
}