Resharper فخ "تحويل إلى" العودة "بيان"
-
06-07-2019 - |
سؤال
نظرا الروتينية التالية:
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
وتحويل يستخدم إذا كان الفرع الثاني يستخدم. - هناك التحويل الضمني في كل الاتجاهات:وقت التحويل البرمجي خطأ
- لا توجد تحويلات إما الطريقة:وقت التحويل البرمجي خطأ
هل هذا يساعد ؟
لا تنتمي إلى StackOverflow