不知道大家看到这两句话时是怎么理解的,反正我是没有理解清楚,于是放狗查了一下,最终我的理解是:
这些变化是在一个大的原则下进行的,即给程序所需要的范围一个更大的范围。
也许还是不清楚,来看一下小例子吧:
01 namespace ConsoleApplication1
02 {
03 class Program
04 {
05 static void Main(string[] args)
06 {
07 #region covariance test
08 Func<object> covarianceTest1 = () => getObject();
09 Func<object> covarianceTest2 = () => getString();
10 #endregion
11
12 #region contravariance test
13 Action<string> contravarianceTest1 = obj => setObject(obj);
14 Action<string> contravarianceTest2 = str => setString(str);
15 #endregion
16 }
17
18 private static object getObject() { return null; }
19 private static void setObject(object obj) { }
20
21 private static string getString() { return null; }
22 private static void setString(string str) { }
23
24 }
25
26
27 }
以Func<object>为例,它是协变事例:covarianceTest2所需的返回类型是一个object类的,但我给它实例化后,确是一个更精确的类型string,这是好理解的。
以Action<string>为例,它是逆变事例:contravarianceTest1所需的参数类型是一个string类的,但我给它实例化后,确是一个范围更大的类型object。
所有这些都是ms在定义这门语言时设计的,你可以把它当成一个语法记下来。