出于好奇:是否可以在C#中定义事件而不定义委托类型?
类似于public event (delegate void(int)) EventName
答案 0 :(得分:18)
内置了泛型委托类型Action<>
和Func<>
,其中Action返回void。每个泛型类型参数是要传递给委托的参数的类型类型。 e.g。
public event Action<int> EventName;
此外,还有一个通用EventHandler<T>
遵循传递Object sender的约定,并具有EventArgs类型。
答案 1 :(得分:4)
不,这是不可能的; ECMA-334,§17.7声明:
事件声明的类型应为委托类型(第11.2节)
和§11.2定义:
delegate-type:
type-name
但是,从C#3开始,您可以使用各种预定义的泛型类型,例如Action<int>
,这样您几乎不必定义自己的委托类型。
答案 2 :(得分:1)
不,AFAIK使用C#是不可能的。
我之所以这么认为,.NET事件基本上是一个添加了某些限制的委托。也就是说,event
关键字未定义新的类型;从概念上讲,它更像是一个修饰符(想象诸如private
或readonly
之类的东西),它在声明中用于修改已有的委托类型。正是这种修改增加了限制:
public EventHandler x;
这是一个普通的委托,可以传递(复制)并由任何人调用。
public event EventHandler x;
在幕后,这也是一个普通的委托,但它只能设置(=
)并由包含x
的类型调用;此外,代表不能传递给第三方;这些操作只能执行add
(+=
)和remove
(-=
)操作。