我正在尝试转换一个逆变委托,但由于某种原因,我只能使用“as”运算符来实现。
interface MyInterface { }
delegate void MyFuncType<in InType>(InType input);
class MyClass<T> where T : MyInterface
{
public void callDelegate(MyFuncType<MyInterface> func)
{
MyFuncType<T> castFunc1 = (MyFuncType <T>) func; //Error
MyFuncType<T> castFunc2 = func as MyFuncType<T>;
MyFuncType<T> castFunc3 = func is MyFuncType<T> ? (MyFuncType<T>)func : (MyFuncType<T>)null; //Error
}
}
castFunc2 工作正常,但 castFunc1 和 castFunc3 导致错误:
Cannot convert type 'delegateCovariance.MyFuncType<myNamespace.MyInterface>' to myNamespace.MyFuncType<T>'
关于 as 运算符的MSDN 文章指出 castFunc2 和 castFunc3 是“等效的”,所以我不明白它们中的一个如何会导致错误。另一个让我困惑的部分是,将 MyInterface 从接口更改为类可以消除错误。
谁能帮我理解这里发生了什么?谢谢!