gpt4 book ai didi

c# - 创建既不是 true 也不是 false 的 bool 值

转载 作者:行者123 更新时间:2023-11-30 13:35:41 26 4
gpt4 key购买 nike

免责声明:这与 Nullable<bool> 无关什么的。

我看到有人创建了一个 bool 值,它既不是 truefalse .这是为什么在 C# 中不可能进行穷举匹配的一个例子。不幸的是,我丢失了一个例子的源代码,我真的很想恢复它。

所以问题是:如何制作default在下面的代码中调用arm?

bool b = GetMyWeirdBool()
switch (b)
{
case true: Console.WriteLine("true"); break;
case false: Console.WriteLine("false"); break;
default: Console.WriteLine("neither o_0"); break;
}

IIRC 通过 Marshal 进行了一些肮脏的黑客攻击或 StructLayout什么的。

最佳答案

可能是值为 43 或类似值的 true。重点是:Boolean 是一个谎言——它在 IL 级别不存在。它只是一个值为零或非零的整数。这适用于任何 bool 值(1、-1 或 42)的“brtrue”和“brfalse”操作码 - 当您在两个本应为 bool 值的值之间进行相等性测试时会出现问题:“ceq”操作码对于两个实际上不相等的真 bool 值将失败。同样,如果值不是编译器预期的值,“开关”操作码(跳转表 - 通常用于 C# 中的 switch)将失败。

这可能会混淆某些 API,在与另一个真值相等时返回假,但在通过 brtrue 进行比较时报告真。

通过 unsafe 代码将 int 视为 bool:

static unsafe bool GetMyWeirdBool()
{
int i = 42;
return *(bool*)(&i);
}

通过 IL:

static bool GetMyWeirdBool()
{
var method = new DynamicMethod("evil", typeof(bool), null);
var il = method.GetILGenerator();
il.Emit(OpCodes.Ldc_I4, 42);
il.Emit(OpCodes.Ret);
var func = (Func<bool>)method.CreateDelegate(typeof(Func<bool>));
return func();
}

通过具有重叠字段的struct:

[StructLayout(LayoutKind.Explicit)]
struct Evil
{
public Evil(int value)
{
Boolean = false;
Int32 = value;
}
[FieldOffset(0)]
public bool Boolean;

[FieldOffset(0)]
public int Int32;

}
static bool GetMyWeirdBool()
{
var val = new Evil(42);
return val.Boolean;
}

关于c# - 创建既不是 true 也不是 false 的 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48344107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com