C# 带派生参数的Func
我有几个方法的参数是派生类型:C# 带派生参数的Func,c#,inheritance,delegates,func,C#,Inheritance,Delegates,Func,我有几个方法的参数是派生类型: bool Method1(ChildType1); bool Method2(ChildType2); 具有从父类型继承的ChildType1和ChildType2 我想要一个可以接受Method1或Method2但得到编译错误的委托: Func<ParentType, bool> MyDelegate = Method1; Func MyDelegate=Method1; 错误1“Method1”没有重载与委托“Func' 有没有办法避免这种
bool Method1(ChildType1);
bool Method2(ChildType2);
具有从父类型继承的ChildType1
和ChildType2
我想要一个可以接受Method1或Method2但得到编译错误的委托:
Func<ParentType, bool> MyDelegate = Method1;
Func MyDelegate=Method1;
错误1“Method1”没有重载与委托“FuncFunc<ParentType, bool> MyDelegate = Method1;
//Method1 does not accept a parameter of type ChildType2, but MyDelegate does
MyDelegate(new ChildType2());
Func MyDelegate=Method1;
//Method1不接受ChildType2类型的参数,但MyDelegate接受
MyDelegate(新的ChildType2());
这与您不能将List
的实例强制转换为List
的原因相同,因为这样您就可以调用animals.Add(cat)
,这将不得不在运行时引发异常,因为猫无法添加到狗的列表中。否
想想如果可能的话会发生什么:
Func<ParentType, bool> MyDelegate = Method1;
//Method1 does not accept a parameter of type ChildType2, but MyDelegate does
MyDelegate(new ChildType2());
Func MyDelegate=Method1;
//Method1不接受ChildType2类型的参数,但MyDelegate接受
MyDelegate(新的ChildType2());
这与您无法将
List
的实例强制转换为List
的原因相同,因为这样您就可以调用animals.Add(cat)
,这将不得不在运行时引发异常,因为猫无法添加到狗的列表中。使用委托协方差/逆变。请参见此处@Marteen委托的返回类型是协变的(参数是逆变的)。OP需要协变参数,这是不可能的。为什么要这样做?潜在的需求是什么?这只是为了防止在我的代码中使用大量的开关盒。我会调用适当的方法,而不是每次调用其中一个方法时都必须切换上下文。是一次优化尝试。@AD-请检查此代码-使用委托协方差/逆变。请参见此处@Marteen委托的返回类型是协变的(参数是逆变的)。OP需要协变参数,这是不可能的。为什么要这样做?潜在的需求是什么?这只是为了防止在我的代码中使用大量的开关盒。我会调用适当的方法,而不是每次调用其中一个方法时都必须切换上下文。是一次优化尝试。@AD-Do请检查此代码-