日期:2014-05-17  浏览次数:20953 次

C# 泛型委托的可逆变不能协变的问题?
//定义两个泛型委托实现
static void SetObject(object o) { }

static void SetString(string s) { }

Action<object> actObject = SetObject;    
Action<string> actString = actObject; //ok

Action<string> actString1 = SetString;
Action<object> actObject1 = actString1;//编译不通过 why??

------解决方案--------------------
比如说你设计了这样一个函数:
int GetStringLength(string s) { ... }
传入string可以得到它的长度,但是传入object,如果这个object不是string,比如是Color,那就不合法。

反过来,你设计这样一个函数:
Type GetObjectType(object o) { ... }
传入任何object都可以得到它的类型,当然,你传入string,string是一种object,它也能得到Type。
------解决方案--------------------
看看Action的定义吧:

public delegate void Action<in T>(T obj);

看到那个in了没?对参数仅支持逆变哦!