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

Why is this switch case returning a double even though it is an int?

给定以下代码:

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"),
};

现在,如果 header.DataContentTypeDataContentType.INTEGER,该值将作为双精度值分配给 value,而不是作为 int(int)value导致 InvalidCastException

如果我调试,我可以清楚地看到它进入 INTEGER 情况,如果我在调试控制台中计算 BitConverter.ToInt32(currentValueBytes.ToArray()),我得到一个整数 returned。但是,一旦退出 switch case,变量 value 的类型就是 double.

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

我希望切换到 return 任何类型的 BitConverter returns。如何使 BitConverter return 成为正确的 BitConverter 案例的类型?

switch 表达式替换为实际的 switch 语句赋值 valueswitch 表达式有一个 return 类型,它是所有 case 类型中的“最佳”类型,如果没有“最佳”类型,您将收到编译器错误。所以每个案例都转换为“最佳”类型。

我敢肯定,如果 switch 表达式中的每个案例都是 returns 一致的类型,事情会更好。你展示的演员阵容是多余的。每个 BitConverter 调用 returns 您期望的类型。

但是,请记住,这些东西中的每一个最终都会在您的代码中的某个时刻作为 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"),
};

我很好奇您此时将如何消费 value。拆箱是一项精细的操作。我唯一一次做过这样的事情是在 JSON-ification 操作的上游(Newtonsoft JSON package if very happy serializing boxed native value types)。