5

我有以下两种转换intshort?.

  1. 如果值不在短范围内,则第一个失败。
  2. 第二种方法有效,但它有一个不必要的conversion to string.

有没有更好的方法?

编辑

从下面的答案:

Int16 只是 Int32 的一个子集,因此您不需要任何转换为​​“中间”类型。

代码

//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;
}

参考:

  1. Java:从 int 到 short 的转换
4

2 回答 2

9

为什么不能简单地使用演员表的内置转换?只需添加一个检查以确保它没有超出范围(如果您想要一个null值而不是异常)。

short? ConvertToShort(int value)
{
    if (value < Int16.MinValue || value > Int16.MaxValue)
        return null;

    return (short)value;
}

关于您的方法:

  1. 它可以工作(当然),但null如果value超出Int16.

  2. 这太慢了。不要忘记Int16只是其中的一个子集,Int32因此您不需要任何转换为​​“中间”类型。

于 2013-02-22T13:25:32.977 回答
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;
}
于 2013-02-22T13:31:23.047 回答