値型にオブジェクトをキャストする際にC#のアンボクシング例外を解決するための最善の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/1153612

  •  18-09-2019
  •  | 
  •  

質問

私はC#1にVB.NETからコードスニペットを変換し、この問題でつまずいています。

このコードを考えてみます:

    Dim x As Integer = 5
    Dim y As Object = x
    Dim z As Decimal = CType(y, Decimal)

コンパイラからか、実行時にエラーはありません。 zは5です。

今度は、C#

にこのコードを変換してみましょう
    int x = 5;
    object y = x;
    decimal z = (decimal)y;
例外がスローされ、コンパイラからではなく、実行時に

エラーなします:

    Cannot unbox "y" to "decimal"

今、私の質問はこれを行うための賢いC#の方法だろうこれは、あるます。

現在、私のコードは次のようになります。

    int x = 5;
    object y = x;
    decimal z = decimal.Parse(y.ToString());

しかし、別の解決策は以下のようになります:

    decimal z = (decimal)(int)y;

少し混乱に見えますが、propably decimal.Parseより少ないオーバーヘッドを持っている、私は推測します。

役に立ちましたか?

解決

あなたは箱入りのオブジェクトが整数であることが予想される場合は、

(decimal)(int)xはそうすることの正しい方法です。文字列に変換して解析すると、問題を攻撃するための良い方法ではなく、いくつかのオーバーヘッドが発生します。

あなただけのオブジェクトが何らかの方法でdecimalに変換することができます知っている場合は、System.Convert.ToDecimal方法を試してみてください。それはあなたのためにそれを処理します。

他のヒント

いかがます:

z = Convert.ToDecimal(y);

Convert.ToDecimal(Y)

あなたは完全に安全になりたい場合は、試みることができる:

    int x = 5;
    object y = x;
    decimal z;
    if (Decimal.TryParse(y.ToString(), out z))
    {
        // z is a decimal
    }
    else
    {
        // z is not a decimal
    }
誰かが=「ロバ」にYを設定した場合、あなたが例外をスローすることなく、それを扱うことができます。

この方法。もちろん、あなたがzが変換できない場合に例外をスローすることもできます。ちょうど別のオプション...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top