我有一个奇怪的行为,只出现在一个内置的应用程序(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>
.
为什么这种情况只发生在构建中,而不是在编辑器中?
为什么这种情况只发生在构建中,而不是在编辑器中?
因为编辑器执行的是IL代码,而不是本地代码。当使用IL2CPP构建项目时,Unity会在创建本地二进制之前将脚本和汇编的IL代码转换为C++。如果出现任何错误,很可能是代码从c#转换到c++的bug。