سؤال

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top