是否强制转换

时间:2018-10-02 10:32:47

标签: c# casting

这是我的原始功能

 private static Int32 getInt(byte[] Data, char Endianness)
        {
            if (Data.Length > 3)
            {
                switch (Endianness)
                {
                    case 'l':
                        return ((Int32)(Data[3]) << 24) + ((Int32)(Data[2]) << 16) + ((Int32)(Data[1]) << 8) + (Int32)(Data[0]);
                    case 'b':
                        return ((Int32)(Data[0]) << 24) + ((Int32)(Data[1]) << 16) + ((Int32)(Data[2]) << 8) + (Int32)(Data[3]);
                    default:
                        throw new ArgumentException("Wrong endianness type", "Endianness types are 'l' or 'b'");
                }
            }
            else
            {
                throw new ArgumentException("NVM data corruption", "Failed to parse NVM data");
            }
        }

我正在使用Resharper,它建议删除对Int32的转换,因为它是多余的。

所以我们将此代码作为输出

 private static int getInt(byte[] Data, char Endianness)
    {
        if (Data.Length > 3)
        {
            switch (Endianness)
            {
                case 'l':
                    return (Data[3] << 24) + (Data[2] << 16) + (Data[1] << 8) + Data[0];
                case 'b':
                    return (Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + Data[3];
                default:
                    throw new ArgumentException("Wrong endianness type", "Endianness types are 'l' or 'b'");
            }
        }
        throw new ArgumentException("NVM data corruption", "Failed to parse NVM data");
    }

在代码中,您看到我将Data[2] << 16移到该数字可能会从原始字节溢出的情况,如果我删除了对Int32的强制转换,是否冒着对字节进行修整的风险?

能否请您解释一下C#预处理器/编译器在做什么?

谢谢

1 个答案:

答案 0 :(得分:4)

强制类型转换是多余的,因为当您使用Data[2]运算符时,编译器会自动将left-shift提升为整数,并且该运算的结果也将为整数。因此不会丢失任何数据。