我已经学习了C#中的协变和逆变。下面我的代码有一个错误。
object a = new object();
int b = 10;
a = b; // not error
Func<object> acO = () => new object();
Func<int> acI = () => 1;
acO = acI; // error
错误信息:
无法隐式地将类型“System.Func”转换为类型“System.Func”。
我以为如果 int -> object 是可能的,那么 Func -> Func 也会是可能的。 但事实并非如此。
我认为值类型在返回时会被复制以供使用,而不像引用类型(对象)那样导致意外操作(如异常)。我的猜测正确吗?
期待您的智慧回答。 谢谢阅读。
int
转换为object
是一种装箱转换,而不是派生类所得到的引用转换,这就是为什么(好或坏)编译器不会允许隐式地进行此转换,因为它需要在内部生成一个新的委托。acO = () => acI()
可以工作,因为你自己明确地进行了装箱。 - Jeroen Mostert