【发布时间】:2016-04-10 13:34:07
【问题描述】:
Xamarin Assebly 浏览器为事件生成以下代码
public event BooleanPreference.ValueChangedHandler ValueChanged {
[MethodImpl (MethodImplOptions.Synchronized)]
add {
this.ValueChanged = (BooleanPreference.ValueChangedHandler)Delegate.Combine (this.ValueChanged, value);
}
[MethodImpl (MethodImplOptions.Synchronized)]
remove {
this.ValueChanged = (BooleanPreference.ValueChangedHandler)Delegate.Remove (this.ValueChanged, value);
}
}
编译它会产生错误,例如
Error CS0079: The event `EdB.Interface.BooleanPreference.ValueChanged' can only appear on the left hand side of `+=' or `-=' operator (CS0079) (EdB.Interface)
如何转换代码以使其工作?
稍后在代码中引用事件
if ((!flag.HasValue || flag.Value != this.boolValue) && this.ValueChanged != null) {
this.ValueChanged (value);
}
导致同样的错误
Error CS0079: The event `EdB.Interface.BooleanPreference.ValueChanged' can only appear on the left hand side of `+=' or `-=' operator (CS0079) (EdB.Interface)
编辑:
以下代码
public delegate void ValueChangedHandler (bool value);
public event BooleanPreference.ValueChangedHandler ValueChanged;
protected void OnValueChanged(EventArgs e) {
var evt = ValueChanged;
if (evt != null) {
evt(this, e);
}
}
生产
Error CS1593: Delegate `EdB.Interface.BooleanPreference.ValueChangedHandler' does not take `2' arguments (CS1593) (EdB.Interface)
【问题讨论】:
-
那是因为 Xamarin 反编译器不处理事件的二元性。事件标识符可以在内部用作字段,但在外部用作事件。反编译器应该将其反编译为字段,但它没有,而是将其反编译为带有添加/删除访问器的显式事件声明。这使得对事件的所有访问都作为字段非法。
标签: c# .net events xamarin disassembly