5

に変換するには、次の 2 つの方法がありintますshort?

  1. 値が短い範囲にない場合、最初の 1 つは失敗します。
  2. 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場合、変換が失敗する可能性があります。valueInt16

  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 に答える