为什么这个 switch case 返回一个 double 即使它是一个 int?

Ron*_*Dex 2 c# switch-statement .net-core

给出以下代码:

object value = header.DataContentType switch
{
    DataContentType.DOUBLE => (double)BitConverter.ToDouble(currentValueBytes.ToArray()),
    DataContentType.FLOAT => (float)BitConverter.ToSingle(currentValueBytes.ToArray()),
    DataContentType.BYTE => (byte)contentData[i],
    DataContentType.SHORT => (short)BitConverter.ToInt16(currentValueBytes.ToArray()),
    DataContentType.INTEGER => (int)BitConverter.ToInt32(currentValueBytes.ToArray()),
    DataContentType.LONG => (long)BitConverter.ToInt64(currentValueBytes.ToArray()),
    _ => throw new InvalidDataException("Invalid data type"),
};
Run Code Online (Sandbox Code Playgroud)

现在,在header.DataContentTypeis 的情况下DataContentType.INTEGER,该值被分配为 double tovalue而不是 anint(int)value导致 InvalidCastException

如果我调试,我可以清楚地看到它进入INTEGER案例,如果我BitConverter.ToInt32(currentValueBytes.ToArray())在调试控制台中评估,我会返回一个整数。然而,只要 switch case 退出,变量value的类型就是 double。

此外,如果我手动执行value = BitConverter.ToInt32(currentValueBytes.ToArray())变量是正确的类型int。由于某种奇怪的原因,暗示 switch 语句必须将类型更改为 double 。

我希望 switch case 返回返回的任何类型BitConverter。如何使BitConverter返回正确 BitConverter 案例的类型?

Fly*_*g57 6

我很确定如果switch表达式中的每个案例都返回一致的类型,事情会更好。你展示的演员表是多余的。这些 BitConverter 调用中的每一个都返回您期望的类型。

但是,请记住,这些东西中的每一个最终都会object在代码中的某个点被装箱。如果您指定拳击发生的时间和方式可能会更好。考虑这样的事情:

object value = header.DataContentType switch
{
    DataContentType.DOUBLE => (object)BitConverter.ToDouble(currentValueBytes.ToArray()),
    DataContentType.FLOAT => (object)BitConverter.ToSingle(currentValueBytes.ToArray()),
    DataContentType.BYTE => (object)contentData[i],
    DataContentType.SHORT => (object)BitConverter.ToInt16(currentValueBytes.ToArray()),
    DataContentType.INTEGER => (object)BitConverter.ToInt32(currentValueBytes.ToArray()),
    DataContentType.LONG => (object)BitConverter.ToInt64(currentValueBytes.ToArray()),
    _ => throw new InvalidDataException("Invalid data type"),
};
Run Code Online (Sandbox Code Playgroud)

我很好奇你此时将如何消费value。拆箱是一个微妙的操作。我唯一一次做这样的事情是在 JSON 化操作的上游(如果很高兴序列化盒装本机值类型,Newtonsoft JSON 包)。