我有两种方法可以将int
转换为short?
。
conversion to string
。有更好的方法吗?
修改:
从下面的答案:
Int16只是Int32的一个子集,因此您无需转换为“中间”类型。
CODE
//Approach 1
int vIn = 123456789;
short? vOut = Convert.ToInt16(vIn);
//Value was either too large or too small for an Int16.
//Approach 2
short? vOut2 = null;
int vIn2 = 123456789;
short number;
string characterRepresentationOfInt = vIn2.ToString();
bool result = Int16.TryParse(characterRepresentationOfInt, out number);
if (result)
{
vOut2 = number;
}
参考:
答案 0 :(得分:8)
为什么你不能简单地使用强制转换的内置转换?只需添加一个检查以确保它不在范围之外(如果您想要null
值而不是异常)。
short? ConvertToShort(int value)
{
if (value < Int16.MinValue || value > Int16.MaxValue)
return null;
return (short)value;
}
关于您的方法:
它有效(当然),但如果null
超出value
的有效范围,您将永远无法获得Int16
值,转换可能会失败。
速度非常慢。不要忘记Int16
只是Int32
的一个子集,因此您无需转换为“中间”类型。
答案 1 :(得分:1)
以下是一些可能的解决方案。
静态辅助方法:
public static class Number
{
public static bool TryConvertToShort(int value, out short result)
{
bool retval = false;
result = 0;
if (value > Int16.MinValue && value < Int16.MaxValue)
{
result = Convert.ToInt16(value);
retval = true;
}
return retval;
}
}
用法:
int a = 1234;
short b;
bool success = Number.TryConvertToShort(a, out b);
扩展方法:
public static class ExtendInt32
{
public static bool TryConvertToShort(this int value, out short result)
{
bool retval = false;
result = 0;
if (value > Int16.MinValue && value < Int16.MaxValue)
{
result = Convert.ToInt16(value);
retval = true;
}
return retval;
}
}
用法:
int a = 1234;
short b;
bool success = a.TryConvertToShort(out b);
您还可以创建一个不会正常失败的辅助/扩展方法,而是返回默认值(0)或抛出异常。
public static short ConvertToShort(int value)
{
short result;
if (value > Int16.MinValue && value < Int16.MaxValue)
{
result = Convert.ToInt16(value);
}
else
{
throw new OverflowException();
}
return result;
}