非泛型委托声明如下:
delegate void Print(int arg);
其中void
是返回类型,int
是参数类型。
通用委托声明如下:
delegate void Print<T> (T arg);
其中void
再次是 return 类型,括号中的T
是泛型参数类型。
现在我们已经知道了返回类型和参数类型,那么为什么我们需要额外的类型角度括号 Print<T>
?它意味着什么?
提前谢谢大家。
答案 0 :(得分:5)
需要<T>
中的Print<T>
来告诉编译器您打算创建泛型方法。否则,它可能认为T
是某种类型,而不是类型参数。虽然直觉上你可以推断出作者的意思,但编译器更能直接了解它。
答案 1 :(得分:4)
它告诉编译器他正在处理泛型方法。
您的建议是编译器会推断此声明是通用的:
delegate void Print (T arg)
在
存在的情况下会发生什么class T { }
答案 2 :(得分:4)
如果括号中没有“额外类型”,C#编译器就无法知道它是否应该将参数列表中的T
视为泛型类型,或者它应该期望一个名称实际为{{ 1}}与T
中一样。
答案 3 :(得分:2)
侧面注释:delegate void Print(T arg);
在泛型类中是完全有效的语法,它意味着“此委托与整个类采用与arg
相同的类型”(假设T是类的泛型类型) 。
您也可以在同一个班级中声明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);
}
}
}