通用委托类型声明语法

时间:2012-08-22 05:09:14

标签: c# .net delegates

非泛型委托声明如下:

delegate void Print(int arg);

其中void返回类型int参数类型

通用委托声明如下:

delegate void Print<T> (T arg);

其中void再次是 return 类型,括号中的T泛型参数类型

现在我们已经知道了返回类型和参数类型,那么为什么我们需要额外的类型角度括号 Print<T> ?它意味着什么?

提前谢谢大家。

4 个答案:

答案 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);
   }
}
}