非泛型委托声明如下完成。泛型委托类型声明语法
一个通用的委托声明如下:
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,但有潜在下半年如果通用类内部使用(增加了一个答案)。 –