I have the following code:
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
The second line compiles but the third line fails to compile with error:
Cannot implicitly convert type ‘
System.Func<object,string>‘ to ‘System.Func<int,string>‘
Why is that?
I understand that with genetics although string is derived from object a List<string> does not derive from List<object>, but here object to string works and object to int fails, why?
OK let’s say I understood why; the question now is there a way around it (other then defining MyInt class to box int because Func<object,string> to Func<MyInt,string> works)?
It is because
Funcis defined asFunc<in T, out TResult>, MSDN is here, soTis contra-variant withinkeyword, that is, you can use either the type you specified or any type that is less derived, but remember that co-variance and contra-variance do not support for value type:Why covariance and contravariance do not support value type
So, it works for
stringbut does not work out withint. You might need to read more about covariance and contravariance:http://msdn.microsoft.com/en-us/library/dd233060.aspx
http://msdn.microsoft.com/en-us/library/dd799517.aspx