学习如何使用自定义事件时出错
本文关键字:出错 事件 自定义 何使用 学习 | 更新日期: 2023-09-27 18:30:35
我正在学习如何在 C# 中使用自定义事件,但出现一些错误我得到粗体字中的"非静态字段、方法或属性需要对象引用"
所以我尝试遵循这个
但是无法尝试情况 1,因为 TypeChanged 已经是一种非静态方法(我认为)在情况 2 中,我得到"无法访问 BicycleType 作为实例引用,将其限定为类型"
public class Bicycle
{
public event EventHandler TypeChanged;
private string type;
...
public string BicycleType {
get { return this.type; }
set {
this.type = value;
if (this.TypeChanged != null)
this.TypeChanged( this, new EventArgs() );
}
}
public Bicycle() {}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("heila!");
Bicycle istanza = new Bicycle();
istanza.TypeChanged += new EventHandler(**istanza_TypeChanged**);
istanza.BicycleType = "io";
Console.WriteLine("io");
}
void istanza_TypeChanged(object sender, EventArgs e) {
Console.WriteLine("rofkd");
}
}
我遵循的教程告诉我,我可以使用事件"as"方法,也许我在这里错了?代码与 TE 教程代码完全相似
对不起,我的英语不好,提前感谢
当您从 main 方法注册事件(静态)时,事件处理程序 (istanza_TypeChanged) 也必须设为静态。
你的问题是Main
是静态的,因此无法访问类Program
的非静态成员。但是,您尝试访问istanza_TypeChanged
。这就是导致您的异常的原因。
您还必须使istanza_TypeChanged
静态才能解决问题
class Program
{
static void Main(string[] args)
{
Console.WriteLine("heila!");
Bicycle istanza = new Bicycle();
istanza.TypeChanged += new EventHandler(**istanza_TypeChanged**);
istanza.BicycleType = "io";
Console.WriteLine("io");
}
static void istanza_TypeChanged(object sender, EventArgs e)
{
Console.WriteLine("rofkd");
}
}
从非静态上下文注册事件或将事件更改为静态。
将istanza_TypeChanged
更改为以下内容:
private static void istanza_TypeChanged(object sender, EventArgs e)
{
Console.WriteLine("rofkd");
}
以下内容为我触发了事件:
public class Bicycle
{
public event EventHandler TypeChanged;
private string type;
public string BicycleType
{
get { return this.type; }
set
{
this.type = value;
if (this.TypeChanged != null)
this.TypeChanged(this, new EventArgs());
}
}
public Bicycle()
{
}
private class Program
{
private static void Main(string[] args)
{
Console.WriteLine("heila!");
Bicycle istanza = new Bicycle();
istanza.TypeChanged += istanza_TypeChanged;
istanza.BicycleType = "io";
Console.WriteLine("io");
}
private static void istanza_TypeChanged(object sender, EventArgs e)
{
Console.WriteLine("rofkd");
}
}
}