接泛型四
20.6.5语法歧义
在§20.9.3和§20.9.4中简单名字(simple-name)和成员访问(member-access)对于表达式来说容易引起语法歧义。例如,语句
F(G<A,B>(7));
可以被解释为对带有两个参数G<A和B>(7)的F的调用[1]。同样,它还能被解释为对带有一个参数的F的调用,这是一个对带有两个类型实参和一个正式参数的泛型方法G的调用。
如果表达式可以被解本文来源gaodaimacom搞#^代%!码&网(析为两种不同的有效方法,那么在“>”能被解析作为运算符的所有或一部分时,或者作为一个类型实参列表,那么紧随“>”之后的标记将会被检查。如果它是如下之一:
{ } ] > : ; , . ?
那么“>”被解析作为类型实参列表。否则“>”被解析作为一个运算符。
20.6.6对委托使用泛型方法
委托的实例可通过引用一个泛型方法的声明而创建。委托表达式确切的编译时处理,包括引用泛型方法的委托创建表达式,这在§20.9.6中进行了描述。
当通过委托调用一个泛型方法时,所使用的类型实参将在委托实例化时被确定。类型实参可以通过类型实参列表显式给定,或者通过类型推断(§20.6.4)而确定。如果采用类型推断,委托的参数类型将被用作推断处理过程的实参类型。委托的返回类型不用于推断。下面的例子展示了为一个委托实例化表达式提供类型实参的方法。
delegate int D(string s , int i)delegate int E();class X{public static T F<T>(string s ,T t){…}public static T G<T>(){…}static void Main(){D d1 = new D(F<int>); //ok,类型实参被显式给定D d2 = new D(F); //ok,int作为类型实参而被推断E e1 = new E(G<int>); //ok,类型实参被显式给定E e2 = new E(G); //错误,不能从返回类型推断}}
在先前的例子中,非泛型委托类型使用泛型方法实例化。你也可以使用泛型方法创建一个构造委托类型的实例。在所有情形下,当委托实例被创建时,类型实参被给定或可以被推断,但委托被调用时,可以不用提供类型实参列表(§15.3)。
20.6.7非泛型属性、事件、索引器或运算符
属性、事件、索引器和运算符他们自身可以没有类型实参(尽管他们可以出现在泛型类中,并且可从一个封闭类中使用类型实参)。如果需要一个类似属性泛型的构件,取而代之的是你必须使用一个泛型方法。
20.7约束