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”没有重载与委托“Func'

有没有办法避免这种情况?

没有

想想如果可能的话会发生什么:

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)
,这将不得不在运行时引发异常,因为猫无法添加到狗的列表中。

想想如果可能的话会发生什么:

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请检查此代码-