解决由于编译器生成的副本而导致自身之间的歧义吗?

ice*_*cub 6 c# events ambiguity unity-game-engine

常规
使用 Unity 引擎开发游戏模组。


我尝试使用以下代码附加到activeSceneChanged事件的问题:

SceneManager.activeSceneChanged += OnSceneChanged;
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

CS0229 “SceneManager.activeSceneChanged”和“SceneManager.activeSceneChanged”之间存在歧义

检查这里发生的情况后,该成员似乎activeSceneChanged既是用户生成的又是 [CompilerGenerate]:

在此输入图像描述

老实说,我自己尝试过,
我根本不知道如何解决这样的问题。我以前从未遇到过。问了我认识的其他一些开发人员,但他们也从未见过。使用 ILSpy 反编译 Unity DLL 文件,结果发现 CompilerGenerate 代码不在那里(有点有意义,因为它是由我假设的编译器生成的)。

我真的很想得到一些关于如何处理和解决这个问题的帮助。

编辑
为了帮助加快速度,这里有一个指向该模组的 Github 链接: https: //github.com/skarab42/ValheimTwitch

在 Plugin.cs 的第 93 行弹出错误

Mic*_*Liu 2

通常,当类声明事件时,C# 编译器会发出由同名字段public支持的事件:private

[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private static UnityAction<Scene, Scene> activeSceneChanged;

public static event UnityAction<Scene, Scene> activeSceneChanged
{
    add { ... }
    remove { ... }
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,Unity DLL 似乎已被修改,该字段的可访问性从 更改privatepublic. SceneManager.activeSceneChanged因此,事件和字段之间的标识符现在不明确。

此问题的理想解决方案是修复修改 Unity DLL 的工具。当存在同名事件时,它不应更改字段的可访问性。

同时,您可以引用未修改的 Unity DLL,也可以使用 Reflection 添加事件处理程序:

typeof(SceneManager).GetEvent("activeSceneChanged").GetAddMethod()
    .Invoke(null, new object[] { (UnityAction<Scene, Scene>)OnSceneChanged });
Run Code Online (Sandbox Code Playgroud)