4

コードスニペットをVB.NETからC#に変換したところ、この問題に遭遇しました。

このコードを考えてみましょう:

    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;

これは少し紛らわしいように見えますが、おそらくdecimal.Parseよりもオーバーヘッドが少ないと思います。

4

4 に答える 4

10

どうですか:

z = Convert.ToDecimal(y);
于 2009-07-20T13:35:08.800 に答える
7

(decimal)(int)xボックス化されたオブジェクトが整数であると予想される場合は、これを行う正しい方法です。文字列への変換と解析は、問題を攻撃するための良い方法ではなく、いくらかのオーバーヘッドが発生します。

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

于 2009-07-20T13:37:15.243 に答える
2

Convert.ToDecimal(y);

于 2009-07-20T13:36:16.990 に答える
0

完全に安全になりたい場合は、次を試すことができます。

    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 を = "donkey" に設定した場合、例外をスローすることなく処理できます。もちろん、z を変換できない場合は、例外をスローすることをお勧めします。ちょうど別のオプション...

于 2009-07-20T13:46:48.400 に答える