反作用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;