سؤال

short s;
s = (EitherTrueOrFalse()) ? 0 : 1;

هذا فشل مع:

خطأ CS0266: لا يمكن أن يحول ضمنا نوع "int" إلى "قصيرة". يوجد تحويل صريح (هل تفتقد صرفة؟)

هل يمكن لأي شخص أن يفسر لماذا هذا كذلك؟ الشيء الوحيد الذي يمكنني التفكير فيه هو أن المترجم لا ينظر إلى القيمة الثانية ولا يعرف النطاق بين الاثنين، في حالة كتبت شيئا مثل

short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;

صيح؟ الإصلاح الوحيد هو المصبوب القبيح؟

أيضا، يبدو C # ليس لديه لاحقة من النوع لنوع قصير. هذا هو الرقابة الخطيرة خلاف ذلك، كان ذلك حلا ...

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

المحلول

المحول البرمجي لديه تحويل ضمني من ثابت التعبير إلى أنواع مختلفة بدائية (طالما كانت القيمة ضمن النطاق المناسب)، ولكن التعبير هنا ليس ثابتا - إنه مجرد تعبير كثيف. إنه نفس الشيء كما هو:

short s;
s = CallSomeMethodReturningInt32();

بقدر ما يتعلق الأمر بالمترجم.

هناك خياران - هل يمكن أن يلقي التعبير بأكمله، أو يلقي كل من المعاملتين الأخيرتين:

short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;

لجعل نوع التعبير العام short. وبعد في هذه الحالة بالذات، من المؤسف أنه لا يوجد لاحقة حرفية رقمية تعلن صراحة short حرفي. يبدو أن مصممي اللغة يعتبرون هذا، لكنهم شعروا أنه وضع نادر نسبيا. (أعتقد أنني ربما أوافق.)

الجزء حول التحويلات الثابتة الضمنية هو من قسم المواصفات C # 3.1.8:

6.1.8 تحويلات التعبير المستمر الضمني

يسمح تحويل تعبير ثابت ضمني التحويلات التالية:

  • أ ثابت التعبير (§ 16) من النوع int يمكن تحويلها إلى نوع SBYTE، byte, short, ushort, uint, ، أو ulong، قدمت قيمة ثابت التعبير يوجد ضمن نطاق نوع الوجهة.
  • أ ثابت التعبير من النوع long يمكن تحويلها إلى الكتابة ulong, ، قدمت قيمة ثابت التعبيرليس سلبيا.

نصائح أخرى

بسبب ال يتم cast بواسطة المترجم, ، وليس في وقت التشغيل، لن أتسعوها بمضخة قبيحة، وأود أن أسميها بناء جملة معقدة:

s = (EitherTrueOrFalse()) ? (short)0 : (short)1;

أعني، هذه هي الطريقة التي كتبها في C #، حتى لو كانت تبدو قبيحة.

انظر الى هذا بلوق المادةوبعد يرى إجابة ماركيل في هذا السؤال.

أعتقد أن هذا له نفس السبب لأن هذا لن يترجم:

short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;

أي أنه كلما يتم استخدامه لفترة قصيرة لشيء ما، يتم الترويج لها إلى int.

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