2012-08-22 178 views
3

非泛型委托声明如下完成。泛型委托类型声明语法

一个通用的委托声明如下:

delegate void Print<T> (T arg); 

其中void再次括号中的返回类型和T泛型参数类型

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

谢谢大家提前。

回答

5

<T>Print<T>是需要告诉编译器,你打算创建一个通用的方法。否则它可能认为T是某种类型,而不是类型参数。虽然直觉上你可以推断出作者的意思,但编译器更多地关注它。

+1

+1,但有潜在下半年如果通用类内部使用(增加了一个答案)。 –

4

它告诉编译器他正在处理一个通用的方法。

你所暗示的是,编译器会推断出这个声明是通用的:

delegate void Print (T arg) 

什么的

class T { } 

存在发生什么呢?

4

没有在支架上说,“额外的类型”,有没有办法让C#编译器能够知道它是否应该在参数列表中把T作为通用型或应该期待一个类型,其名字真Tclass T {}

2

排序方式说明:delegate void Print(T arg);在泛型类中是完全有效的语法,意思是“这个委托与全类的arg相同”(假设T是类的泛型类型)。

你也可以在同一个类中声明delegate void Print2<T>(T arg);。含义(和comiler警告你)是不同的:代表使用任何类型作为参数,并且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); 
    } 
} 
} 
+0

非常好的阐述,现在我得到了@Vitaliy的观点。 – Marshal