只有在构建之后才会发生接口铸造异常

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

我有一个奇怪的行为,只出现在一个内置的应用程序(UWP,IL2CPP)。

我有以下设置

public interface IExample
{
    void ExecuteWhenDone(Action<IExample> whenDone);
}

public class Example : IExample
{
    private event Action<Example> OnDone;

    public void ExecuteWhenDone(Action<IExample> whenDone)
    {
        OnDone += whenDone;
    }

    // ...
}

当然,后来我在通过

OnDone?.Invoke(this);

然后从另一个类中,我做了如。

public class SomeOtherClass
{
    public void Initialize(IExample example)
    {
        example.ExecuteWhenDone(DoSomething);
    }

    private void DoSomething(IExample example)
    {
        // ...
    }
}

在Unity编辑器中,这工作得很好。

但是在构建之后(UWP, IL2CPP),我得到了一个无效的Cast Exception for

OnDone += whenDone;

它说它不能转换 Action<IExample>Action<Example>.

为什么这种情况只发生在构建中,而不是在编辑器中?

c# unity3d exception casting
1个回答
0
投票

为什么这种情况只发生在构建中,而不是在编辑器中?

因为编辑器执行的是IL代码,而不是本地代码。当使用IL2CPP构建项目时,Unity会在创建本地二进制之前将脚本和汇编的IL代码转换为C++。如果出现任何错误,很可能是代码从c#转换到c++的bug。

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