反作用lambda-C#

反作用lambda-C#,c#,lambda,delegates,variance,C#,Lambda,Delegates,Variance,我有这样一个类层次结构 public abstract class CalendarEventBase{} public class TrainingEvent : CalendarEventBase{} public class AuditEvent : CalendarEventBase{} 我想创建一个action-action-lamda,它有一个CalendarEventBase类型的泛型类型参数,我可以将该参数分配给以下不同的方法: public void EmailCance

我有这样一个类层次结构

public abstract class CalendarEventBase{}

public class TrainingEvent : CalendarEventBase{}

public class AuditEvent : CalendarEventBase{}
我想创建一个action-action-lamda,它有一个CalendarEventBase类型的泛型类型参数,我可以将该参数分配给以下不同的方法:

public void EmailCancelation(TrainingEvent trainingEvent)

public void EmailCancelation(AuditEvent auditEvent)
我创建了以下非法分配:

Action<CalendarEventBase> emailCancelation = _trainingService.EmailTrainingCancellation;
Action emailcancellation=\u trainingService.EmailTrainingCancellation;
编译器抱怨说,它希望使用void(CalendarEventBase)作为签名的方法。我对此感到惊讶,因为我认为它会接受一个更派生的类型

为了解决这个问题,我创建了以下委托,使我能够完成任务:

public delegate void EmailCancelation<in T>(T calendarEvent) where T : CalendarEventBase;
公共委托无效电子邮件取消(T calendarEvent),其中T:CalendarEventBase;
我的问题是,我是否可以在不创建其他代理的情况下完成任务?我想我可以创建一个动作实例

非常感谢您的帮助或指点。

行:

Action<CalendarEventBase> emailCancelation = _trainingService.EmailTrainingCancellation;
但这很好:

// Anything that you want to with an animal, you can do with a mammal.
Action<Mammal> mammalAction = MethodThatTakesAnAnimal; 
//你想对动物做任何事,都可以对哺乳动物做。
动作哺乳动物动作=采用动物的方法;

lambda无法支持此操作,因为您声明的emailCancelation变量将接受CalendarEventBase,但实际实现将只接受TrainingEvent。如果有人使用AuditEvent参数调用emailCancelation,会发生什么

// Anything that you want to with an animal, you can do with a mammal.
Action<Mammal> mammalAction = MethodThatTakesAnAnimal;