繁体   English   中英

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

[英]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()) ,我会得到一个 integer 返回。 但是,一旦退出 switch case,变量value的类型就是 double。

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

我希望开关盒返回BitConverter返回的任何类型。 如何使BitConverter返回正确的 BitConverter 案例的类型?

如果switch表达式中的每个 case 返回一致的类型,我很确定事情会更好。 你展示的演员阵容是多余的。 这些 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"),
};

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

switch表达式替换为分配value的实际switch语句。 switch表达式有一个返回类型,它是所有案例类型中的“最佳”类型,当没有“最佳”类型时,您将收到编译器错误。 因此,每个案例都转换为“最佳”类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM