4

我有以下代码:

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>”隐式转换为“ System.Func<int,string>

这是为什么?

我知道,虽然 string 是从 object a派生而List<string>不是从 派生的List<object>,但是在遗传学objectstring起作用并且失败objectint,为什么?

好吧,假设我明白为什么;现在的问题是有没有办法解决它(除了定义MyInt类来装箱int,因为Func<object,string>可以Func<MyInt,string>工作)?

4

2 回答 2

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

于 2012-10-23T07:11:20.263 回答
3

因为 co/contra-variance 不适用于值类型。

请看这里

仅当类型参数是引用类型时才支持变体。值类型不支持方差。
以下也不编译:

// int is a value type, so the code doesn't compile.
IEnumerable<Object> objects = new List<int>(); // Compiler error here.
于 2012-10-23T07:10:45.713 回答