لماذا لا يتم تجميع رمز C# هذا؟
سؤال
double? test = true ? null : 1.0;
في كتابي ، هذا هو نفسه
if (true) {
test = null;
} else {
test = 1.0;
}
لكن السطر الأول يعطي خطأ المترجم هذا:
لا يمكن تحديد نوع التعبير الشرطي لأنه لا يوجد تحويل ضمني بين "
<null>
' و 'double
'.
المحلول
يحدث هذا لأن المترجم يحاول تقييم البيان من اليمين إلى اليسار. هذا يعني أنه يرى 1.0
ويقرر أنه مزدوج (ليس ضعف؟) ثم يرى null
.
لذلك من الواضح أنه لا يوجد تحويل ضمني بين double
و null
(في الواقع لا يوجد تحويل ضمني بين Struct
و null
).
ما يمكنك فعله هو إخبار المترجم صراحة أن أحد التعبيرين القابل للتحويل لبعضهما البعض.
double? test = true ? null : (double?) 1.0; // 1
double? test = true ? (double?)null : 1.0; // 2
double? test = true ? default(double?) : 1.0; // 3
double? test = true ? new double?() : 1.0; // 4
نصائح أخرى
double? test = true ? (double?)null : 1.0;
سيعمل. هذا لأنه لا يوجد تحويل من نوع التعبير الأول (null
) إلى نوع التعبير الثاني (double
).
لا يتم استخدام الجانب الأيسر من المهمة عند استنتاج نوع التعبير؟
في b ? A : B
, ، وأنواع من A
و B
يجب أن يكون هو نفسه ، أو يجب أن يكون واحد قابلاً للتحويل ضمنيًا إلى الآخر.
نظرًا لأن المترجم لا يمكن أن يكتشف أنه لكي يكون NULL و 1.0 متوافقًا ، يجب أن يتم إلقاء القيم على مضاعفة؟. هذا يحتاج إلى ذكر صراحة.
double? test = true ? (double?) null : 1.0;