该事件可以只出现在左手侧+ =或 - =

问题描述 投票:0回答:1

在Visual Studio 2015年,当我试图运行此代码出现CS0079编译错误:

public delegate void CostumeLOD(AvatarCustomization costume);

public event CostumeLOD OnCostumeLOD
        {
            add
            {
                CostumeLOD costumeLOD01 = this.OnCostumeLOD;
                CostumeLOD costumeLOD02;
                do
                {
                    costumeLOD02 = costumeLOD01;
                    costumeLOD01 = Interlocked.CompareExchange(ref this.OnCostumeLOD, (CostumeLOD)Delegate.Combine(costumeLOD02, value), costumeLOD01);
                }
                while (costumeLOD01 != costumeLOD02);
            }
            remove
            {
                CostumeLOD costumeLOD01 = this.OnCostumeLOD;
                CostumeLOD costumeLOD02;
                do
                {
                    costumeLOD02 = costumeLOD01;
                    costumeLOD01 = Interlocked.CompareExchange(ref this.OnCostumeLOD, (CostumeLOD)Delegate.Remove(costumeLOD02, value), costumeLOD01);
                }
                while (costumeLOD01 != costumeLOD02);
            }
        }

事件“OnCostumeLOD”只能出现在+=' or- =”操作的左手侧

有人能帮助我找到一个方法来解决这个问题?

c# compiler-errors event-handling
1个回答
0
投票

我不服气,实施明确的event是真的有必要在这里。你似乎在试图使它线程安全的,但是编译器提供的实施已经做的是一个合理的工作。

这就是说,如果你想要的代码工作,你需要声明自己支持字段的事件。例如:

private CostumeLOD _onCostumeLOD;
public event CostumeLOD OnCostumeLOD
{
    add
    {
        CostumeLOD costumeLOD01 = this._onCostumeLOD;
        CostumeLOD costumeLOD02;
        do
        {
            costumeLOD02 = costumeLOD01;
            costumeLOD01 = Interlocked.CompareExchange(ref this._onCostumeLOD, (CostumeLOD)Delegate.Combine(costumeLOD02, value), costumeLOD01);
        }
        while (costumeLOD01 != costumeLOD02);
    }
    remove
    {
        CostumeLOD costumeLOD01 = this._onCostumeLOD;
        CostumeLOD costumeLOD02;
        do
        {
            costumeLOD02 = costumeLOD01;
            costumeLOD01 = Interlocked.CompareExchange(ref this._onCostumeLOD, (CostumeLOD)Delegate.Remove(costumeLOD02, value), costumeLOD01);
        }
        while (costumeLOD01 != costumeLOD02);
    }
}

注:我没有任何权利要求上述是否真正解决了什么的线程安全性问题,您正试图解决的问题。我只是提供意见,以如何得到它来编译。

© www.soinside.com 2019 - 2024. All rights reserved.