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
作品和object
以int
失败了,为什么?
好吧,让我说我理解为什么; 现在的问题是有办法解决它(其他然后定义MyInt
类框int
,因为Func<object,string>
对Func<MyInt,string>
作品)?
这是因为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