サイドノートの並べ替え:ジェネリッククラス内で完全に有効な構文であり、「このデリゲートはクラス全体delegate void Print(T arg);
と同じ型を取る」ことを意味します(Tがクラスのジェネリック型であると仮定します)。arg
delegate void Print2<T>(T arg);
同じクラスで宣言することもできます。意味 (およびコミラーが警告します) は異なります: デリゲートは任意の型を引数として使用し、クラスで使用されるものとT
は無関係です(コードでそうするのは良くなく、混乱を招くことに注意してください)。T
class GenericClass<T>
{
delegate void Print(T arg); // T is the same as T in the class
delegate void Print2<T>(T arg); // T is unrelated to T in the class.
}
関数を含む同様のコード:
using System;
class Program {
void Main()
{
var x = new A<int>();
// x.Print("abc"); - compile time error
x.Print(1); // Print only accepts same Int32 type
x.Print2(1); // Print2 can use as the same Int32 used for class
x.Print2("abc"); // as well any other type like string.
}
public class A<T>
{
public void Print(T arg)
{
Console.WriteLine("Print:{0} = {1}", arg.GetType().FullName, arg);
}
public void Print2<T>(T arg)
{
Console.WriteLine("PRINT2:{0} = {1}", arg.GetType().FullName, arg);
}
}
}