Microsoft内部属性 - 此属性没有setter

时间:2013-03-09 19:47:10

标签: c# visual-studio-2012 ilspy

当我从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 =语句都有错误。

3 个答案:

答案 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;  // <--