为什么C#事件不能直接订阅其他事件

为什么C#事件不能直接订阅其他事件,c#,events,delegates,C#,Events,Delegates,为什么下面的代码不打印“Hello,World!” 与 一切正常 如果禁止这样做,订阅一个事件到另一个事件有什么意义,为什么这样做时没有编译错误或警告?它失败的原因与此代码打印“2”的原因相同: 这里,您的事件处理程序是赋值时a.Evnt的值——当您将a传递到B的构造函数时a对Evnt拥有的值,这就是B为事件处理程序获得的值 public B(A a) { a.Evnt += Evnt; // this does not work } 它实际上工作得很好——它按你说的做。只是你以为你在

为什么下面的代码不打印“Hello,World!”

一切正常


如果禁止这样做,订阅一个事件到另一个事件有什么意义,为什么这样做时没有编译错误或警告?

它失败的原因与此代码打印“2”的原因相同:

这里,您的事件处理程序是赋值时
a.Evnt
的值——当您将
a
传递到
B
的构造函数时
a
Evnt
拥有的值,这就是
B
为事件处理程序获得的值

public B(A a)
{
    a.Evnt += Evnt; // this does not work
}
它实际上工作得很好——它按你说的做。只是你以为你在告诉它做些不同的事情

在这里,您有一个处理程序,它在执行处理程序的任何时间对Evnt本身进行计算。因此,在这个例子中,如果同时
a.Evnt
发生了变化,您将看到
a.Evnt
的新值的输出

public B(A a)
{
    a.Evnt += v => Evnt(v);
}
像这样重写B,你会得到一个更清晰的画面:

public class B
{

    public B(A a)
    {
        a.Evnt += Evnt; // this does not work
    }

    public event Action<string> Evnt = v => { Console.WriteLine("Original"); };

}
公共B类
{
公共图书馆B(A)
{
a、 Evnt+=Evnt;//这不起作用
}
公共事件操作Evnt=v=>{Console.WriteLine(“原始”);};
}

你问题的标题措词不当;您不是在分配事件,而是在分配事件处理程序。此外,“这不起作用”不是描述问题的有用方法。事情有无数种不起作用的方式。我的第一个假设是,您的代码甚至不会编译。下次,请描述你期望看到的行为,以及你实际看到的。说明它是否未能编译,或者在运行时抛出异常,或者只是悄悄地做了一些您没有预料到的事情。如果有错误消息或异常消息,请提供消息的文本

因为lambda在调用时求值并捕获,否则+=附加一次,然后在ref上调用(不求值)

int x = 2;
int y = x;

Action a = () => Console.WriteLine(y);

x = 3;
a();
public B(A a)
{
    a.Evnt += Evnt; // this does not work
}
public B(A a)
{
    a.Evnt += v => Evnt(v);
}
public class B
{

    public B(A a)
    {
        a.Evnt += Evnt; // this does not work
    }

    public event Action<string> Evnt = v => { Console.WriteLine("Original"); };

}