从Func <object,string>到Func <string,string>的转换工作但到Func <int,string>失败

Roe*_*sim 4 c# generics func covariance contravariance

我有以下代码:

static Func<object, string> s_objToString = (x) => x.ToString();
static Func<string, string> s_stringToString = s_objToString; //compiles
static Func<int, string> s_intToString = s_objToString; //error
Run Code Online (Sandbox Code Playgroud)

第二行编译但第三行无法编译并出现错误:

无法隐式将类型' System.Func<object,string>' 转换为' System.Func<int,string>'

这是为什么?

据我所知,遗传学,尽管字符串是从对象派生List<string>不会得到List<object>,但在这里object,以string作品和objectint失败了,为什么?

好吧,让我说我理解为什么; 现在的问题是有办法解决它(其他然后定义MyInt类框int,因为Func<object,string>Func<MyInt,string>作品)?

cuo*_*gle 5

这是因为Func定义为 Func<in T, out TResult>,MSDN在这里,所以与关键字T反变量的in,也就是说,你可以使用你指定的类型或任何类型较少的类型,但要记住共方差和反方差不支持价值类型:

为什么协方差和逆变不支持值类型

所以,它适用string但不起作用int.您可能需要阅读有关协方差和逆变的更多信息:

http://msdn.microsoft.com/en-us/library/dd233060.aspx

http://msdn.microsoft.com/en-us/library/dd799517.aspx