为什么这个 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.DataContentType
是 DataContentType.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
语句赋值 value
。 switch
表达式有一个 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)。
给定以下代码:
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.DataContentType
是 DataContentType.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
语句赋值 value
。 switch
表达式有一个 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)。