为什么System.Delegate不能作为事件?
Why System.Delegate can not be used as event?
主要问题
event System.Delegate d;
上面的代码会引发错误:
Compiler Error CS0066
'event': event must be of a delegate type
为什么System.Delegate不能用作事件?
如果我想让一个事件接受任何类型的委托,我应该使用什么?
之后
(一周后补上,下面跟问题关系不大,更多是自己的问题。)
感谢@John。
感谢他的回答。感谢你问我“你为什么想要这样的东西?”。
我说“如果我需要一个活动,但我不确定我可以在活动中使用什么样的方法。那么我想要一个任何类型的活动。”
我心中的情况是这样的:
有一个像环境这样复杂的class,从它的不同部分改变可能会引发不同类型的事件。
class Environment
{
float temperature;
float humidity;
float factor3;
float factor4;
float factor5;
//more factors may be added later.
}
/*
Need an event for Environment.
The event should invoke:
TemperatureInfluence.OnTemperatureChange(...)
HumidityInfluence.OnHumidityChange(...)
Factor3And4Influence.OnFactor3And4Change(...)
Factor4And5Influence.OnFactor4And5Change(...)
and it should be albe to handle mehtod of new kinds.
*/
class TemperatureInfluence
{
public void OnTemperatureChange(float temperature)
{
Console.WriteLine("Temperature changed, put on more or less clothes");
}
}
class HumidityInfluence
{
public void OnHumidityChange(float humidity)
{
Console.WriteLine("Humidity changed, drink more or less water");
}
}
class Factor3And4Influence
{
public void OnFactor3And4Change(float factor3, float factor4)
{
Console.WriteLine("Factor3 and Factor4 changed, do blablabla");
}
}
class Factor4And5Influence
{
public void OnFactor4And5Change(float factor4, float factor5)
{
Console.WriteLine("Factor4 and Factor5 changed, do hohohuhu");
}
}
我认为我的问题是我不明白 C# 中的事件关键字是什么。
event关键字给delegate增加了一些特性,仅此而已。(所以应该和delegate一样,有精确的参数。)
它不同于真实的文字事件,后者可以是任何类型。
如果我真的需要任何类型的事件,我不应该指望事件关键字。我想我可能需要为此做一个结构,或者只是为新事件编写新代码。
System.Delegate
是 class,不是代表。
事件是类型的成员。所有成员都必须指定自己的数据类型。如果您希望能够引用任何类型,则可以对字段等使用 Object
,或者您可以使用基类型来引用任何派生类型。委托类型不相互继承,因此没有可指定的基本委托类型来引用派生委托类型。
反正没有意义。您为什么要接受带有您无法为其传递参数的参数的方法的委托?只需将您的事件声明为 EventHandler
类型,然后您就可以传递通常的参数,即 object sender, EventArgs e
但没有参数的方法仍然可以用作处理程序。任何其他参数都没有意义,因为您无论如何都无法提供参数。
主要问题
event System.Delegate d;
上面的代码会引发错误:
Compiler Error CS0066
'event': event must be of a delegate type
为什么System.Delegate不能用作事件?
如果我想让一个事件接受任何类型的委托,我应该使用什么?
之后
(一周后补上,下面跟问题关系不大,更多是自己的问题。)
感谢@John。
感谢他的回答。感谢你问我“你为什么想要这样的东西?”。
我说“如果我需要一个活动,但我不确定我可以在活动中使用什么样的方法。那么我想要一个任何类型的活动。”
我心中的情况是这样的:
有一个像环境这样复杂的class,从它的不同部分改变可能会引发不同类型的事件。
class Environment
{
float temperature;
float humidity;
float factor3;
float factor4;
float factor5;
//more factors may be added later.
}
/*
Need an event for Environment.
The event should invoke:
TemperatureInfluence.OnTemperatureChange(...)
HumidityInfluence.OnHumidityChange(...)
Factor3And4Influence.OnFactor3And4Change(...)
Factor4And5Influence.OnFactor4And5Change(...)
and it should be albe to handle mehtod of new kinds.
*/
class TemperatureInfluence
{
public void OnTemperatureChange(float temperature)
{
Console.WriteLine("Temperature changed, put on more or less clothes");
}
}
class HumidityInfluence
{
public void OnHumidityChange(float humidity)
{
Console.WriteLine("Humidity changed, drink more or less water");
}
}
class Factor3And4Influence
{
public void OnFactor3And4Change(float factor3, float factor4)
{
Console.WriteLine("Factor3 and Factor4 changed, do blablabla");
}
}
class Factor4And5Influence
{
public void OnFactor4And5Change(float factor4, float factor5)
{
Console.WriteLine("Factor4 and Factor5 changed, do hohohuhu");
}
}
我认为我的问题是我不明白 C# 中的事件关键字是什么。
event关键字给delegate增加了一些特性,仅此而已。(所以应该和delegate一样,有精确的参数。)
它不同于真实的文字事件,后者可以是任何类型。
如果我真的需要任何类型的事件,我不应该指望事件关键字。我想我可能需要为此做一个结构,或者只是为新事件编写新代码。
System.Delegate
是 class,不是代表。
事件是类型的成员。所有成员都必须指定自己的数据类型。如果您希望能够引用任何类型,则可以对字段等使用 Object
,或者您可以使用基类型来引用任何派生类型。委托类型不相互继承,因此没有可指定的基本委托类型来引用派生委托类型。
反正没有意义。您为什么要接受带有您无法为其传递参数的参数的方法的委托?只需将您的事件声明为 EventHandler
类型,然后您就可以传递通常的参数,即 object sender, EventArgs e
但没有参数的方法仍然可以用作处理程序。任何其他参数都没有意义,因为您无论如何都无法提供参数。