我有以下代码:
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
第二行可以编译,但第三行无法编译并出现错误:
无法隐式转换类型'System.Func<object,string>
' to 'System.Func<int,string>
'
这是为什么?
我明白,在遗传学中,虽然字符串是从对象 a 派生的List<string>
不源自List<object>
, 但在这儿object
to string
作品和object
to int
失败了,为什么?
好吧,假设我明白为什么;现在的问题是有办法解决它(除了定义MyInt
类到框int
因为Func<object,string>
to Func<MyInt,string>
works)?
这是因为Func
定义为Func<in T, out TResult>
,MSDN 是here, so T
is 逆变 with in
关键字,也就是说,您可以使用您指定的类型或任何派生较少的类型,但请记住协变和逆变不支持值类型:
为什么协变和逆变不支持值类型
所以,它适用于string
但不起作用int
。您可能需要阅读更多有关协变和逆变:
http://msdn.microsoft.com/en-us/library/dd233060.aspx
http://msdn.microsoft.com/en-us/library/dd799517.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)