ما هو أفضل نهج لحل استثناء Unboxing C # عند إلقاء كائن إلى نوع ValueType؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

لقد قمت للتو بتحويل مقتطف رمز من VB.NET إلى C # وتعثرت خلال هذه المشكلة.

النظر في هذا الرمز:

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

لا يوجد خطأ من برنامج التحويل البرمجي أو في وقت التشغيل. ض خمسة.

الآن دعونا نرجم هذا الرمز إلى C #

    int x = 5;
    object y = x;
    decimal z = (decimal)y;

لا يوجد خطأ من برنامج التحويل البرمجي ولكن عند وقت التشغيل يتم طرح استثناء:

    Cannot unbox "y" to "decimal"

الآن سؤالي هو، الذي سيكون أذكى ج # طريقة للقيام بذلك.

حاليا رمز بلدي يبدو.

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

لكن حل آخر سيكون:

    decimal z = (decimal)(int)y;

التي تبدو مربكة بعض الشيء، ولكنها لها نقود أقل من decimal.parse، أعتقد.

هل كانت مفيدة؟

المحلول

(decimal)(int)x هي الطريقة الصحيحة للقيام بذلك إذا كنت تتوقع أن تكون الكائن المعاصر عددا صحيحا. التحويل إلى السلسلة والتحليل ليس وسيلة جيدة لمهاجمة المشكلة وتتحمل بعض النفقات العامة.

إذا كنت تعرف فقط أن الكائن يمكن تحويله إليه decimal بطريقة ما، حاول System.Convert.ToDecimal طريقة. سوف تتعامل مع ذلك بالنسبة لك.

نصائح أخرى

ماذا عن:

z = Convert.ToDecimal(y);

تحويل.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 إلى = "Donkey" يمكنك التعامل معه دون إلقاء استثناء. بالطبع، قد تفضل رمي استثناء إذا تعذر تحويل Z. مجرد خيار آخر ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top