Rog*_*mbe 1 c# events contravariance
如果我有一个引发事件的类,使用(例如)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 { }
Run Code Online (Sandbox Code Playgroud)
我问的原因是ReSharper似乎在XAML中遇到(看起来像)等效的问题,我想知道它是否是ReSharper中的错误,或者是我对C#的理解错误.
也许covariant不是这个词
关.你正在寻找的词是逆变的.将方法组转换为委托类型在返回类型中是协变的,在形式参数类型中是逆变的.
这是我关于这个主题的博客文章:
如果我有一个引发事件的类,使用(例如)FrobbingEventArgs,我是否可以使用带有EventArgs的方法来处理它?
嗯,你尝试了它并且它有效,所以显然是的.有关规范中的理由,请参阅标题为"方法组转换"的部分.
| 归档时间: |
|
| 查看次数: |
1303 次 |
| 最近记录: |