gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:47:09 24 4
gpt4 key购买 nike

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

using System;

namespace Test
{
public class Program
{
public static void Main(string[] args)
{
var a = new A();
var b = new B(a);
b.Evnt += val => Console.WriteLine(val);
a.Do();
}
}

public class A
{
public void Do()
{
Evnt("Hello, World!");
}

public event Action<string> Evnt = v => {};
}

public class B
{

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

public event Action<string> Evnt = v => {};

}
}

但是如果我换行

a.Evnt += Evnt;

a.Evnt += v => Evnt(v);

一切正常。

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

最佳答案

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

int x = 2;
int y = x;

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

x = 3;
a();

在这里,您的事件处理程序是 a.Evnt 在赋值时的值 - 无论 a 有什么Evnt 在您将 a 传递给 B 的构造函数时,这就是 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"); };

}

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

关于c# - 为什么C#事件不能直接订阅其他事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46526736/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com