Xamarin编译了“Unsafe.As〈bool,int>(ref test1)”,如果在Android触摸屏上拖动,则返回不同的值

vbopmzt1  于 2022-12-07  发布在  Android
关注(0)|答案(1)|浏览(106)

我目前正在构建一个Android应用程序,基本上看起来像旧的Windows95迷宫屏幕保护程序。我使用C#与Xamarin和MonoGame。简介(我的迷宫生成器在3D)
下面是浏览器中的WASM编译版本:http://devedse.softether.net:5003/
由于某种原因,我无法在我的手机上运行发布版本,所以我开始深入研究发生了什么。一个又一个奇怪的错误之后,我终于在这段代码中找到了它:

var res1 = Unsafe.As<bool, int>(ref test1);

调试版本与发布版本

在Xamarin的调试版本中,这会导致:True -> 1 and False -> 0.
如果您在出版组建中执行此程式码,结果会有所不同:True -> -703131391 and False -> 0
下面是我用来测试的代码:

bool test1 = true;
bool test2 = false;

var res1 = Unsafe.As<bool, int>(ref test1);
var res2 = Unsafe.As<bool, int>(ref test2);

string helpStringToDraw =
    $"{n}{n}1: {test1} -> {res1} , 2: {test2} -> {res2}{n}" +
...

下面是两个版本的截图。调试:

发布版本:

所以这基本上是我的第一个问题。

触摸触摸屏

然而,如果你点击模拟器中的触摸屏,并拖动此代码的输出更改为正确的值。(wtf moment here)。
我制作了一个小视频来展示这一点:https://youtu.be/crzY-a2pb5I
"该怎么办"
所以希望有人能给予我一些建议,这是Xamarin / C#中的一个bug,还是这是不安全命令的预期行为。其次,我想以一种不会影响性能的方式解决这个问题。(为了好玩,我正在编写一个迷宫生成器,通过尽可能多地进行微优化并引入if-会生成分支的检查实际上会稍微减慢算法)。

4urapxun

4urapxun1#

根据文件:https://learn.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.unsafe.as?view=net-6.0
Unsafe.As(o)的行为只有在典型的“安全”转换操作(T)o成功时才是明确定义的。不支持使用此API来规避否则会失败的转换,并且可能导致运行时不稳定。
如果我正确地理解了你的代码,你的T是(bool, int),显然它违反了上面的规则。
因此,在.NET中,而不仅仅是Xamarin中,这是预期有时会失败的事情。

相关问题