为何object类型值为0、100等时,value is ushort判断返回false?
问题:Object类型判断ushort始终返回false的原因及解决办法
我需要明确判断object类型的值具体是ushort、short、int、long还是double类型,编写了如下代码:
string dataType = ""; object value = 0; if (value is ushort) { dataType = "ushort"; } else if (value is short) { dataType = "short"; } else if (value is int || value is long || value is ulong || value is double) { dataType = "int"; } else { dataType = "float"; }
但if (value is ushort)这一行,在value为0、100等小于65535的值时,判断结果始终为false,请问这是为什么?
原因分析
问题核心在于C#值类型的装箱规则:
- 像
0、100这类整数字面量,默认类型是int(System.Int32)。当你把它赋值给object变量时,装箱后的对象本质是int类型实例,而非ushort。 is运算符判断的是对象的实际运行时类型,而非值是否落在目标类型的取值范围内。哪怕数值在ushort区间内,只要装箱后的类型是int,value is ushort就会返回false。
举个直观的例子:
object value1 = 0; // 装箱为int类型实例 Console.WriteLine(value1 is ushort); // 输出false object value2 = (ushort)0; // 显式声明为ushort后装箱 Console.WriteLine(value2 is ushort); // 输出true
解决方案
根据需求不同,有两种处理方式:
方案1:判断值是否可转换为目标类型(兼容范围判断)
如果需要把落在ushort范围内的int值也识别为ushort,可以结合模式匹配的转换逻辑:
string dataType = ""; object value = 0; if (value is ushort) { dataType = "ushort"; } else if (value is short) { dataType = "short"; } else if (value is int i && i >= ushort.MinValue && i <= ushort.MaxValue) { dataType = "ushort"; } else if (value is int || value is long || value is ulong || value is double) { dataType = "int"; } else { dataType = "float"; }
方案2:严格判断运行时类型
如果只需要识别原本就是ushort类型的装箱对象,直接用GetType()对比类型:
string dataType = ""; object value = 0; Type valueType = value.GetType(); if (valueType == typeof(ushort)) { dataType = "ushort"; } else if (valueType == typeof(short)) { dataType = "short"; } else if (valueType == typeof(int) || valueType == typeof(long) || valueType == typeof(ulong) || valueType == typeof(double)) { dataType = "int"; } else { dataType = "float"; }
内容的提问来源于stack exchange,提问作者Geervani
相关产品推荐
相关产品推荐

