2012-08-22 176 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