سؤال

هل يمكن لأي أحد أن يخبرني لماذا تؤدي العبارة الأولى من العبارات التالية إلى ظهور خطأ في الترجمة بينما لا تظهر العبارة الثانية؟

NewDatabase.AddInParameter(NewCommand, "@SomeString", DbType.String, SomeString ?? DBNull.Value); // <-- Throws compilation error!
NewDatabase.AddInParameter(NewCommand, "@SomeString", DbType.String, (object)(SomeString) ?? DBNull.Value); // <-- Compiles!

لقد جربت أنواعًا أخرى لاغية مثل byte? وحصلت على نفس النتيجة.هل يمكن لأي أحد أن يخبرني لماذا أحتاج إلى الإدلاء بالاعتراض أولاً؟

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

المحلول

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

للحصول على تفاصيل حول كيفية تعريف اللغة عندما يتعلق الأمر بعامل الاندماج الخالي ، راجع مواصفات لغة C # 4 ، القسم 7.13:

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

نصائح أخرى

يفشل المثال الأول لأن رمز علامة الرموز العامة و رمز الترقيم العام ليسا من الأنواع القابلة للتبديل ضمنيًا .

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

DBValue.Null ليس سلسلة ؛إنه كائن.لن يتم تحويل .NET ضمنيًا إلى كائن في التعبيرات ؛يجب إخبارك صراحةً أنك تتوقع نتيجة كائن.

لأن التعبير يحتاج إلى نوع إرجاع واحد.منذ String و DbValue لا يمكن إرسالها لبعضها البعض، ولا يستطيع المترجم معرفة نوع الإرجاع الذي تريده.عندما تقوم بالإرسال إلى كائن، فإنك تمنح المترجم نوعًا يمكنه الإرسال إليه.

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