当我从System.Internal.HandleCollector
类中看到一些系统类时,我正在使用ILSpy:
internal sealed class HandleCollector
{
... bunch of stuff removed ...
internal static event HandleChangeEventHandler HandleAdded
{
[MethodImpl(MethodImplOptions.Synchronized)]
add
{
HandleCollector.HandleAdded = (HandleChangeEventHandler)Delegate.Combine(HandleCollector.HandleAdded, value);
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove
{
HandleCollector.HandleAdded = (HandleChangeEventHandler)Delegate.Remove(HandleCollector.HandleAdded, value);
}
}
... bunch of stuff removed ...
}
当VisualStudio抱怨(我复制了类)该属性没有setter时,Microsoft如何编译?有人可以分解为什么这样可行但我的VS副本抱怨(构建标志?)?
此属性没有setter
每个HandleCollector.HandleAdded =
语句都有错误。
答案 0 :(得分:5)
我们不需要猜测MS源代码是什么,因为它可用here。
这是来自HandleCollector.cs的HandleAdded
的声明:
internal static event HandleChangeEventHandler HandleAdded;
这是一个自动实施的活动。问题在于ILSpy的反编译。也许你应该提交一个bug。
答案 1 :(得分:0)
如果您希望在添加和删除实现中使用赋值进行编译,则需要使用字段。
像这样:
internal sealed class HandleCollector
{
private static HandleChangeEventHandler HandleAddedField;
internal static event HandleChangeEventHandler HandleAdded
{
[MethodImpl(MethodImplOptions.Synchronized)]
add
{
HandleCollector.HandleAddedField = (HandleChangeEventHandler)Delegate.Combine(HandleCollector.HandleAddedField, value);
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove
{
HandleCollector.HandleAddedField = (HandleChangeEventHandler)Delegate.Remove(HandleCollector.HandleAddedField, value);
}
}
}
答案 2 :(得分:0)
让我们从该代码中删除一些不重要的位:
event HandleChangeEventHandler HandleAdded
{
add
{
HandleAdded = (HandleChangeEventHandler)Delegate.Combine(HandleAdded, value);
}
remove
{
HandleAdded = (HandleChangeEventHandler)Delegate.Remove(HandleAdded, value);
}
}
这是不正确的C#代码。通常,必须有此事件的支持委托。分配给事件HandleAdded
具有与此相同的意义:
int Foo
{
set
{
Foo = value;
}
}
所以我猜想 ILSpy只是产生了错误的C#代码。基本上HandleAdded
只是一个没有任何特殊访问者的正常事件。如果你是使用JustDecompile查看相同的事件,这正是您将看到的 - 根本没有自定义访问器方法!
要编译它,请尝试添加支持委托并替换分配目标:
event HandleChangeEventHandler HandleAdded
{
add
{
handleAdded = (HandleChangeEventHandler)Delegate.Combine(handleAdded, value);
}// ^ ^
remove
{
handleAdded = (HandleChangeEventHandler)Delegate.Remove(handleAdded, value);
}// ^ ^
}
HandleChangeEventHandler handleAdded; // <--