سؤال

لدي التالي C# كود:

byte rule = 0;
...
rule = rule | 0x80;

الذي ينتج الخطأ:

لا يمكن تحويل ضمنيا نوع 'int' إلى 'بايت'.تحويل صريح موجود (هل أنت في عداد المفقودين المدلى بها؟)

[تحديث:الإصدار الأول من السؤال كان خطأ ...لقد أساء مترجم الإخراج]

إضافة الزهر لا حل المشكلة:

rule = rule | (byte) 0x80;

أحتاج إلى الكتابة على أنها:

rule |= 0x80;

الذي يبدو غريبا.لماذا |= مشغل أي مختلفة | المشغل ؟

هل هناك أي طريقة أخرى من قول المترجم إلى علاج مستمر كما بايت?


@ جيوفاني Galbo :نعم و لا.رمز هو التعامل مع برمجة ذاكرة فلاش في جهاز خارجي و منطقيا يمثل واحد بايت من الذاكرة.أنا يمكن أن يلقي في وقت لاحق, ولكن هذا يبدو أكثر وضوحا.اعتقد ان ج التراث يظهر من خلال أكثر من اللازم!

@ جوناثان هولندا :إن 'كما' جملة تبدو أكثر إتقانا ولكن للأسف لا يبدو أن العمل.وتنتج:

كما المشغل يجب أن تستخدم مع نوع مرجع أو nullable type ('بايت' غير nullable نوع القيمة)

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

المحلول

int rule = 0;
rule |= 0x80;

http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx العامل | هو تعريف لجميع أنواع قيمة.أعتقد أن هذا سوف تنتج النتيجة المرجوة.فإن "|=" المشغل هو أو ثم تعيين المشغل الذي هو ببساطة اختصار القاعدة = القاعدة | 0x80.

واحدة من niftier الأشياء عن C# هو أنه يتيح لك أن تفعل أشياء مجنونة مثل تعاطي أنواع قيمة ببساطة على أساس الحجم.وهو 'int' هو بالضبط نفس بايت ما عدا المترجم رمي تحذيرات إذا كنت تحاول استخدامها على حد سواء في نفس الوقت.ببساطة الخلاف مع واحد (في هذه الحالة ، الباحث) يعمل بشكل جيد.إذا كنت قلقا بشأن 64bit الاستعداد ، يمكنك تحديد int32 ، ولكن كل رجات هي int32s ، حتى في تشغيل x64 الوضعية.

نصائح أخرى

C# لا الحرفي لاحقة بايت.u = uint, l = طويلة ، ul = ulong ، f = تعويم, m = عشرية, ولكن لا يوجد بايت.عليك أن يلقي ذلك.

يعمل هذا:

rule = (byte)(rule | 0x80);

على ما يبدو التعبير 'القاعدة | 0x80' يعود الباحث حتى إذا قمت بتعريف 0x80 باسم 'const بايت 0x80'.

مصطلح كنت تبحث عن "حرفية" و للأسف C# لا يكون بايت الحرفي.

هنا قائمة كل C# حرفية.

وفقا ECMA مواصفات ، ص 72 لا يوجد بايت الحرفي.صحيح فقط حرفية على أنواع:الباحث ، uint طويلة ، ulong.

يبدو أنك قد تضطر إلى القيام بذلك القبيح الطريقة: http://msdn.microsoft.com/en-us/library/5bdb6693.aspx.

تقريبا خمس سنوات و لا أحد يجيب على السؤال.

بضع إجابات يزعمون أن المشكلة هي عدم وجود بايت الحرفي ، ولكن هذا لا يهم.إذا كان لك حساب (byte1 | byte2) والنتيجة هي من نوع int.حتى لو كان "ب" كانت حرفية لاحقة بايت نوع (23b | 32b) سيظل int.

الجواب المقبول الروابط المقالة MSDN مدعيا أن operator| يتم تعريف كل لا يتجزأ أنواع ، ولكن هذا ليس صحيحا.

operator| لا يعرف على byte لذلك يستخدم المحول البرمجي المعتاد الزائد القرار قواعد اختيار النسخة التي يتم تعريفها على int.وبالتالي, إذا كنت ترغب في تعيين نتيجة إلى byte عليك أن يلقي ذلك:

rule = (byte)(rule | 0x80);

يبقى السؤال لماذا rule |= 0x80; العمل ؟

لأن C# مواصفات خاصة قاعدة مجمع المهمة التي تسمح لك بحذف صريحة التحويل.في المجمع المهمة x op= y والقاعدة هي:

إذا كان المشغل هو محدد مسبقا المشغل ، إذا كانت عودة نوع من المشغل صراحة للتحويل إلى نوع من x و y إذا ضمنا للتحويل إلى نوع من x أو المشغل هو التحول المشغل ، ثم عملية تقييم x = (T)(x op y), حيث T هو نوع من x, إلا أن x هو تقييم مرة واحدة فقط.

للأسف خيارك الوحيد هو أن تفعل ذلك فقط الطريقة التي لديك.لا يوجد لاحقة بمناسبة الحرفي كما بايت.العامل | لا ينص على التحويل الضمني كما الاحالة (أيالتهيئة) من شأنه.

على ما يبدو التعبير 'القاعدة | 0x80' بإرجاع عدد صحيح حتى لو كنت تعريف 0x80 باسم 'const بايت 0x80'.

أعتقد أن القاعدة هي أرقام مثل 0x80 التخلف إلى الباحث إلا إذا كنت تشمل الحرفي لاحقة.حتى عن التعبير rule | 0x80, فإن النتيجة ستكون الباحث منذ 0x80 هو الباحث والمادة (الذي هو بايت) يمكن أن يكون بأمان تحويلها إلى int.

وفقا C القياسية, بايت دائما إلى تعزيز الباحث في التعبير حتى الثوابت.ومع ذلك ، ما دام كل القيم غير موقعة ، بتات الترتيب سيتم تجاهل وبالتالي فإن العملية يجب إرجاع القيمة الصحيحة.

وبالمثل ، يطفو تعزيز مضاعفة ، إلخ.

سحب نسخة من K&R.كل شيء هناك.

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