سؤال

نظرا الروتينية التالية:

private static object ParseNumber(string token, FieldDefinition def)
{
  if (def.Fraction > 0)
    return Double.Parse(token);
  else
    return Int64.Parse(token);
}

Resharper يقدم لي خيار ريفاكتور في بيان مع مشغل الثلاثي:

private static object ParseNumber(string token, FieldDefinition def)
{
  return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}

الذين يمكن أن بقعة الفخ ؟

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

المحلول

حسنا التغيير إلى الإجابة السابقة.لأن هناك ضمني التحويل من Int64 إلى Double (وليس العكس) ، من شأنها أن تكون نتيجة نوع من التعبير.حتى عندما كنت تتوقع الحصول على محاصر Int64, كنت في الواقع الحصول على محاصر Double (ولكن مع القيمة التي جاءت في الأصل من Int64.Parse).

فقط في حال هذا ليس واضحا بما فيه الكفاية ، دعونا نغير كل return مثل هذه التصريحات أنها مجرد عائد متغير.هنا هو رمز الأصلي:

private static object ParseNumber(string token, FieldDefinition def)
{
  if (def.Fraction > 0)
    return Double.Parse(token);
  else
    return Int64.Parse(token);
}

تحويل مناسب:

private static object ParseNumber(string token, FieldDefinition def)
{
  if (def.Fraction > 0)
  {
    double d = Double.Parse(token);
    object boxed = d; // Result is a boxed Double
    return boxed;
  }
  else
  {
    long l = Int64.Parse(token);
    object boxed = l; // Result is a boxed Int64
    return boxed;
  }
}

و الآن دعونا نفعل نفس النسخة مع الشرطي المشغل:

private static object ParseNumber(string token, FieldDefinition def)
{
  return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}

يصبح

private static object ParseNumber(string token, FieldDefinition def)
{
  // The Int64.Parse branch will implicitly convert to Double
  double d = def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
  object boxed = d; // *Always* a Double
  return boxed;
}

تحرير:كما طلبت أكثر قليلا من المعلومات.نوع من التعبير الشرطي من شكل

X ? Y : Z

يعتمد على أنواع من Y و Z, الذي سأتصل TY و TZ.وهناك عدد قليل من الخيارات:

  • TY و TZ هي نفس النوع:النتيجة هي أن نوع
  • هناك التحويل الضمني من TY إلى TZ ولكن ليس من TZ إلى TY:والنتيجة هي من نوع TZ وتحويل يستخدم إذا كان أول فرع يتم استخدامها.
  • هناك التحويل الضمني من TZ إلى TY ولكن ليس من TY إلى TZ:والنتيجة هي من نوع TY وتحويل يستخدم إذا كان الفرع الثاني يستخدم.
  • هناك التحويل الضمني في كل الاتجاهات:وقت التحويل البرمجي خطأ
  • لا توجد تحويلات إما الطريقة:وقت التحويل البرمجي خطأ

هل هذا يساعد ؟

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