1

FrobbingEventArgs などでイベントを発生させるクラスがある場合、EventArgs を受け取るメソッドでそれを処理することはできますか?

ここにいくつかのコードがあります:

class Program
{
   static void Main(string[] args)
   {
      Frobber frobber = new Frobber();
      frobber.Frobbing += FrobberOnFrobbing;
      frobber.Frob();
   }

   private static void FrobberOnFrobbing(object sender,
       EventArgs e)
   {
      // Do something interesting. Note that the parameter is 'EventArgs'.
   }
}

internal class Frobber
{
   public event EventHandler<FrobbingEventArgs> Frobbing;
   public event EventHandler<FrobbedEventArgs> Frobbed;

   public void Frob()
   {
      OnFrobbing();

      // Frob.

      OnFrobbed();
   }

   private void OnFrobbing()
   {
      var handler = Frobbing;
      if (handler != null)
         handler(this, new FrobbingEventArgs());
   }

   private void OnFrobbed()
   {
      var handler = Frobbed;
      if (handler != null)
         handler(this, new FrobbedEventArgs());
   }
}

internal class FrobbedEventArgs : EventArgs { }
internal class FrobbingEventArgs : EventArgs { }

私が尋ねる理由は、ReSharper が XAML の同等のもの (のように見える) に問題があるように見えるためです。それは ReSharper のバグなのか、それとも私の C# の理解の誤りなのか疑問に思っています。

4

3 に答える 3

6

たぶん共変という言葉ではない

近い。あなたが探している単語はcontravariantです。メソッド グループのデリゲート型への変換は、戻り値の型ではであり、仮パラメーターの型では反変です。

この件に関する私のブログ記事は次のとおりです。

https://docs.microsoft.com/en-us/archive/blogs/ericlippert/covariance-and-contravariance-in-c-part-three-method-group-conversion-variance

FrobbingEventArgs などでイベントを発生させるクラスがある場合、EventArgs を受け取るメソッドでそれを処理することはできますか?

ええと、あなたはそれを試してみましたが、うまくいきました。仕様の正当性については、「メソッド グループの変換」というタイトルの便利なセクションを参照してください。

于 2010-05-14T14:53:18.683 に答える
1

はい、できますが、イベントハンドラーでeパラメーターにアクセスすると、派生型としてキャストしない限り、EventArgs基本クラスに属するメンバーにのみアクセスできます。この単語は共変ではなくポリモーフィックであり、c#のすべてのクラスはポリモーフィックであり、言語機能です。

于 2010-05-14T10:49:12.663 に答える
-1

イベントは、イベントを宣言したクラス内からのみ呼び出すことができるため、派生クラスは、基本クラス内で宣言されたイベントを直接呼び出すことはできません。

イベントの保護された呼び出しメソッドを作成することで、目的を達成できます。この呼び出しメソッドを呼び出すことにより、派生クラスはイベントを呼び出すことができます。

さらに柔軟性を高めるために、多くの場合、呼び出し元のメソッドは仮想として宣言されます。これにより、派生クラスがそれをオーバーライドできます。これにより、派生クラスは、基本クラスが呼び出しているイベントを傍受し、独自の処理を行うことができます。

できるよ:

protected void OnFrobbing(EventArgs e) 
   { 
      var handler = Frobbing; 
      if (handler != null) 
         handler(this, new e); 
   } 

または:

protected virtual void OnFrobbing(EventArgs e) 
   { 
      var handler = Frobbing; 
      if (handler != null) 
         handler(this, new e); 
   } 
于 2010-05-14T11:05:24.113 に答える