非泛型委託聲明如下完成。泛型委託類型聲明語法
一個通用的委託聲明如下:
delegate void Print<T> (T arg);
其中void
再次括號中的返回類型和T
是泛型參數類型。
現在我們已經知道返回類型和參數類型,那麼爲什麼我們需要額外的類型角括號Print<T>
?它意味着什麼?
謝謝大家提前。
非泛型委託聲明如下完成。泛型委託類型聲明語法
一個通用的委託聲明如下:
delegate void Print<T> (T arg);
其中void
再次括號中的返回類型和T
是泛型參數類型。
現在我們已經知道返回類型和參數類型,那麼爲什麼我們需要額外的類型角括號Print<T>
?它意味着什麼?
謝謝大家提前。
<T>
在Print<T>
是需要告訴編譯器,你打算創建一個通用的方法。否則它可能認爲T
是某種類型,而不是類型參數。雖然直覺上你可以推斷出作者的意思,但編譯器更多地關注它。
它告訴編譯器他正在處理一個通用的方法。
你所暗示的是,編譯器會推斷出這個聲明是通用的:
delegate void Print (T arg)
什麼的
class T { }
存在發生什麼呢?
沒有在支架上說,「額外的類型」,有沒有辦法讓C#編譯器能夠知道它是否應該在參數列表中把T
作爲通用型或應該期待一個類型,其名字真T
在class T {}
。
排序方式說明: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);
}
}
}
非常好的闡述,現在我得到了@Vitaliy的觀點。 – Marshal
+1,但有潛在下半年如果通用類內部使用(增加了一個答案)。 –