سؤال

أنا الغريب لماذا ضمني يلقي فشل في...

int? someValue = SomeCondition ? ResultOfSomeCalc() : null;

و لماذا يجب أن تؤدي صريح الزهر بدلا من ذلك

int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null;

يبدو لي أن المجمع يحتوي على جميع المعلومات التي تحتاج إلى إجراء ضمني صب القرار لا ؟

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

المحلول

والمادة ذات الصلة من المواصفات C # 3.0 7.13، المشغل الشرطي:

ووالمعاملات الثاني والثالث من: مشغل التحكم في نوع من التعبير الشرطي. دعونا X و Y تكون أنواع المعاملات الثانية والثالثة. ثم،

إذا X و Y هي من نفس النوع، ثم وهذا هو نوع من الشرطي خلاف ذلك، إذا كان التحويل الضمني (§6.1) موجود من X إلى Y، ولكن ليس من Y إلى X، Y ثم هو نوع من التعبير الشرطي. خلاف ذلك، إذا كان التحويل الضمني (§6.1) موجود من Y إلى X، ولكن ليس من X إلى Y، ثم X هو نوع من التعبير الشرطي. خلاف ذلك، يمكن تحديد أي نوع التعبير، ويحدث خطأ وقت التحويل البرمجي.

نصائح أخرى

وأنا أيضا ازعاج أنه لا يمكن الاستدلال على نوع على أساس التعيين ، وخاصة عندما يكون نوع القيمة.هناك أسباب على الرغم عندما تحصل في وجوه heirarchies.

إن "ResultOfSomeCalc()" عاد "int؟", ثم هذا العمل.C# يحتاج إلى معرفة نوع بغض النظر عن ما هو اليسار الإحالة.لذلك كنت أقول أن عليك أن تعود فارغة أو الباحث و المنطق في المحول البرمجي لا وجود لها أن يكون ذلك بديلا Nullable القاسم المشترك.

لاحظ أن هذه المتغيرات لا تعمل, و قد تساعدك على فهم:

object someValue = true ? new Nullable<int>(ResultOfSomeCalc()) : null;

object someValue = true ? (int?)ResultOfSomeCalc() : null;

ويساعد هذا الأمل.

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

int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?);

ولا يبدو هذا استخدام الافتراضي لتكون موثقة بشكل جيد، ولكن لا يعمل. على الأقل يبقى لك من الحاجة إلى القمامة التعليمات البرمجية مع القيم السحرية (وأنا أزعم أن لاغية / صفر / خطأ / الخ. هي القيم السحرية في الواقع).

إذا الدالة ResultofSomeCalc () إرجاع الباحث؟ ثم هذا العمل.

إذا ترجع الدالة كثافة العمليات، ثم يصدر مترجم التحذير:     نوع من التعبير الشرطي لا يمكن تحديده لأنه لا يوجد التحويل الضمني بين "كثافة" و ""
انا التخمين هذا ما كنت ترى. كلا التعبيرات في مشغل المشروط ":" يجب أن يكون من نفس النوع، أو يجب أن تكون قابلة للتحويل إلى نفس النوع عن طريق يلقي ضمني

وتغيير نوع عودة ResultOfSomeCalc لكثافة العمليات؟، أو أنك سوف تحتاج إلى أن يكون المدلى بها على التعبير فارغة.

تأكد الدالة ResultOfSomeCalc () الصورة نوع الإرجاع كما nullabel كثافة العمليات مثل (الباحث؟)
كثافة العمليات؟ someValue = (الباحث؟) SomeCondition؟ ResultofSomeCalc (): (؟ كثافة العمليات) لاغية؛

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