【协变和抗变】
,NET4通过协变和抗变为泛型接口和泛型委托添加了一个 重要的扩展。协变和抗变指对参数和返回值的类型进行转换。例如,可以给一个需要shape参数的 方法传送Recaglc参数码?下面用示例说明这些扩展的优点。
协变<<
如果泛型类型用 out 关键字标注,泛型接口就是协变的。这意味着返回类型只能是T。
抗变<<
如果泛型类型用 in 关键字标注,泛型接口就是抗变的。接口只能把泛型类型T用作其方法的输入。
【泛型结构】
泛型结构没有继承的特性。
【委托】
简单委托实例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp4
{
class MathOperations
{
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
}
delegate double DoubleOp(double x);
class Program
{
static void Main(string[] args)
{
DoubleOp[] operations = {
MathOperations.MultiplyByTwo,
MathOperations.Square
};
for(int i = 0; i < operations.Length; i++)
{
Console.WriteLine("Using operation[{0}]",i);
ProcessAndDisplayNumber(operations[i],2.0);
ProcessAndDisplayNumber(operations[i], 7.94);
ProcessAndDisplayNumber(operations[i],1.414);
Console.WriteLine();
}
Console.ReadKey();
}
static void ProcessAndDisplayNumber(DoubleOp action,double value)
{
double result = action(value);
Console.WriteLine("Value is {0},result of operation is {1}",value,result);
}
}
}
泛型Action<T>委托表示引用一个void返回类型的方法。因为这个委托类存在不同的变体,所以可 以传递至多16种不同的参数类型。没有泛型参数的Action类可调用没有参数的方法。Action<in T>调用带一个参数的方法,Action<in T1,in T2>调 用带两个参数的方法,Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7, in T8>调用带8个参数的方法。
Func<T>委托可以以类似的方式使用。 Func<T>允许调用带返回类型的方法。 与Action类似 , Func<T>也定义了不同的变体,至多也可以传递16个参数类犁和一个返回类型。Func<in T,out TResult> 委托类型可以调用带返回类型且无参数的方法,Func<in T,out TResult>调 用带一个参数的方法 , Func<in T1,in T2 , in T3 ,in T4 , out TResult> 调用带4个参数的方法。
匿名方法<<
匿名方法是用作委托的参数的一段代码。(委托的参数不是方法签名是代码)
规则:匿名方法中不能使用跳转语句(break,goto,continue)跳到匿名方法的外部,同样外部也不能跳到内部。
匿名方法内部不能访问不安全的代码,也不能访问在匿名方法外部使用的ref,out参数。