2
  class Stack<T>
    {
        T[] items;
        int index;

        public delegate void StackDelegate(T[] items);

        internal static void DoWork(int[] items) { }
    }
    class TestStack
    {
        public static void TestSta()
        {
            Stack<float> s = new Stack<float>();
            Stack<int>.StackDelegate d = Stack<float>.DoWork;
        }

        static void Main()
        {
            TestSta();
        }
    }
}

上記のコードでは、非ジェネリック デリゲートがジェネリック クラス内で定義されています。非ジェネリック デリゲートは、包含クラスの型パラメーターを使用します。

デリゲートを参照するときは、デリゲート型が定義された包含クラス名と、包含クラスの型パラメーターの型引数の両方を使用して、デリゲート型の名前を修飾する必要があります。そうしないと、コンパイラーは、デリゲート。

型引数を使用して StackDelegate デリゲートを参照する場合、それはデリゲートの構築に使用される型引数ですか?

 Stack<int>.StackDelegate d = Stack<float>.DoWork;

この場合、デリゲートの構築に使用される型はどれですか? <int>または<float>

また、デリゲートなどのネストされた型が参照されたときにクラスは初期化されますか。次のステートメントStack<int>.StackDelegate dにより、クラス Stack が<int>構築および初期化されますか。その後、ステートメントStack<float>.DoWork;により、クラス Stack の別の構築および初期化が行われますか。つまり、このステートメントを実行した後、実行時にジェネリック クラス スタックから 2 つの初期化された型を取得しますか?

4

2 に答える 2

1

これは、入れ子になったデリゲートを使用するには、その含まれる型を初期化する必要があることを意味しますか (この場合は、ジェネリック Stack クラス)。型パラメーター引数が必要な理由は、1 つないと、含まれるジェネリック クラスが具体的なクラスに構築できるため、初期化できませんか?

いいえ、包含型 ( Stack<T>) を初期化する必要はありません。に静的コンストラクターを追加するStack<T>と、サンプルによって呼び出されないことがわかります。( が呼び出されると初期化dされます)実際には、ジェネリック パラメータの type ごとに 1 つずつ、無限に多くのネストされた型があることに注意してくださいT。タイプStack<int>.StackDelegateStack<float>.StackDelegateは、ランタイムとはまったく異なります。

これは有効ですか?そうでない場合、なぜですか?

はい、メソッドがデリゲート型の戻り値の型と署名に一致するため、有効です。デリゲート型Stack<float>.StackDelegateは をfloat[]パラメーターとして受け取るため、 と互換性がありませんStack<float>.DoWork。別の型パラメーターがStackDelegate必要な場合は、次のように宣言する必要があります。

public delegate void StackDelegate<U>(U[] items);

NowStack<int>.StackDelegate<int>は とは異なる型ですがStack<float>.StackDelegate<int>、これら 2 つのデリゲート型は同じシグネチャと戻り値の型を持っているため、互換性があります。

于 2013-04-20T20:38:37.013 に答える
0

「DoWork」の型はvoid DoWork(int[])(使わない) なので、 の場合はT完全に一致します。StackDelegateTint

DoWorkに依存することを宣言したい可能性がありますT:

 internal static void DoWork(T[] items) { }

この場合、予想されるコンパイル時エラーが発生します。

「DoWork」のオーバーロードがデリゲート「UserQuery.Stack.StackDelegate」に一致しません

于 2013-04-20T20:23:45.427 に答える