5

このようなクラス階層があります

public abstract class CalendarEventBase{}

public class TrainingEvent : CalendarEventBase{}

public class AuditEvent : CalendarEventBase{}

次のさまざまなメソッドに割り当てることができる CalendarEventBase 型のジェネリック型パラメーターを持つアクション Action ラムダを作成したかったのです。

public void EmailCancelation(TrainingEvent trainingEvent)

public void EmailCancelation(AuditEvent auditEvent)

次の違法な割り当てを作成しました:

Action<CalendarEventBase> emailCancelation = _trainingService.EmailTrainingCancellation;

コンパイラは、署名として void(CalendarEventBase) を持つメソッドを予期していたと不平を言います。より派生した型を受け入れると思っていたので、これには驚きました。

これを回避するために、タスクを完了できる次のデリゲートを作成しました。

public delegate void EmailCancelation<in T>(T calendarEvent) where T : CalendarEventBase;

私の質問は、追加の代理人を作成せずにタスクを完了できたでしょうか? Action インスタンスを作成するだけでよいと思いました。

任意のヘルプまたはポインタ、大歓迎です。

4

2 に答える 2

7

この線:

Action<CalendarEventBase> emailCancelation = _trainingService.EmailTrainingCancellation;

実際には反分散ではなく共分散を期待します。しかし、それは論理的に意味がありません。メソッドは入力として a を期待しています - どうすればより一般的な型 ( ) をそれに渡すことができますか?TrainingEventCalendarEventBase

これは合法ではありません:

// What if the method wants to make the lion roar but you pass in a goat?
Action<Mammal> mammalAction = MethodThatTakesALion; 

しかし、これは問題ありません:

// Anything that you want to with an animal, you can do with a mammal.
Action<Mammal> mammalAction = MethodThatTakesAnAnimal; 
于 2011-02-11T11:42:40.597 に答える
1

宣言したemailCancelation変数はCalendarEventBaseを受け入れるため、ラムダはこれをサポートできませんが、実際の実装はTrainingEventのみを受け入れます。誰かがAuditEventパラメーターを使用してemailCancelationを呼び出すとどうなりますか?

于 2011-02-11T11:45:06.383 に答える