2

当我从课堂上发现这个时,我正在使用 ILSpy 仔细阅读一些系统System.Internal.HandleCollector类:

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 抱怨(我复制了该类)该属性没有设置器时,微软如何编译它?有人可以分解为什么这有效但我的 VS 副本抱怨(构建标志?)?

此属性没有设置器

每个HandleCollector.HandleAdded =语句都有错误。

4

2 回答 2

5

我们不需要猜测 MS 源代码是什么,因为它可以在这里找到

这是HandleAdded来自 HandleCollector.cs 的声明:

internal static event HandleChangeEventHandler HandleAdded; 

这是一个自动执行的事件。问题在于 ILSpy 的反编译。也许你应该提交一个错误。

于 2013-03-09T20:15:48.767 回答
0

如果您希望它使用分配 int 进行编译,则添加和删除实现需要使用字段。

像这样:

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);
        }
    }
}
于 2013-03-09T20:12:45.360 回答