سؤال

لماذا هو ممنوع ؟

Nullable<Nullable<int>>

في حين

struct MyNullable <T>
{


}

MyNullable<Nullable<int>> 

لا

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

المحلول

وذلك لأن البنية القيد يعني في الواقع 'لا nullable' منذ Nullable ، على الرغم من كونه البنية ، nullable (يمكن قبول القيمة null) في Nullable<int> ليست صالحة نوع المعلمة الخارجي Nullable.

وهذا صريح في القيود الوثائق

حيث T:البنية
نوع الحجة يجب أن يكون نوع القيمة.أي نوع القيمة إلا Nullable يمكن أن تكون محددة.
انظر استخدام أنواع Nullable (C# البرمجة دليل) لمزيد من المعلومات.

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

  1. المترجم منصة التغييرات المطلوبة لتحقيق Nullable في النموذج الحالي واسعة جدا (و كانت نسبيا اللحظة الأخيرة بالإضافة إلى الإصدار 2.0).
  2. لديهم العديد من يحتمل أن تكون مربكة حافة الحالات.

مما يسمح أي ما يعادل int??إلا تخلط بين أنه منذ اللغة توفر أي وسيلة للتمييز Nullable<Nullable<null>> و Nullable<null> ولا أي حل واضح التالية.

Nullable<Nullable<int>> x = null;
Nullable<int> y = null;
Console.WriteLine(x == null); // true
Console.WriteLine(y == null); // true
Console.WriteLine(x == y); // false or a compile time error!

مما يجعل هذه العودة الحقيقية ستكون جدا مجمع حمل كبير على العديد من العمليات التي تنطوي على Nullable type.

بعض أنواع في CLR هي 'الخاصة' ، أمثلة على سلاسل الأوليات في أن المترجم و runtime تعرف الكثير عن تنفيذ المستخدمة من قبل بعضهم البعض.Nullable هو خاص في هذا الطريق أيضا.لأنه هو بالفعل خاصة فتش في مناطق أخرى خاصة غلاف where T : struct الجانب ليست مثل هذه الصفقة الكبيرة.الاستفادة من هذا هو في التعامل مع البنيات في عام الطبقات لأن أيا منهم ، وبصرف النظر عن Nullable ، يمكن مقارنة فارغة.وهذا يعني jit يمكن بأمان t == null أن تكون كاذبة دائما.

حيث اللغات مصممة للسماح مفهومين مختلفين جدا للتفاعل كنت تميل إلى الحصول على غريب مربكة أو أسفل اليمين حافة خطرة الحالات.وكمثال على النظر في Nullable والمساواة بين المشغلين

int? x = null;
int? y = null;
Console.WriteLine(x == y); // true
Console.WriteLine(x >= y); // false!     

من خلال منع Nullables عند استخدام البنية العامة القيد العديد من سيئة (ومن الواضح) حافة الحالات يمكن تجنبها.

كما أن الجزء المحدد من المواصفات التي ولايات هذا من قسم 25.7 (التشديد من الألغام):

نوع القيمة القيد تحدد نوع الوسيطة المستخدمة في نوع المعلمة يجب أن يكون نوع القيمة (§25.7.1).أي غير nullable البنية نوع, نوع التعداد ، أو نوع المعلمة وجود نوع القيمة القيد يرضي هذا القيد.نوع المعلمة وجود نوع القيمة القيد لا يجوز أيضا أن يكون منشئ-القيد.النظام.Nullable type يحدد غير nullable القيمة نوع القيد T. وهكذا شيدت بشكل متكرر أنواع من أشكال T?و Nullable<Nullable<T>> محظورة.

نصائح أخرى

أعتقد يمكنك فقط استخدام غير nullable أنواع قيمة في Nullables.منذ Nullable في حد ذاته هو nullable ، التعشيش هذه الطريقة محظور.

من http://msdn.microsoft.com/en-us/library/kwxxazwb.aspx

public Nullable(
    T value
)

نوع:T نوع قيمة.

Nullable هو خاص لأن هناك دعم واضح للملاكمة و علبته من أنواع Nullable بنيت في CLR:

إذا كنت تستخدم MSIL box تعليمات ضد Nullable<T>, سوف تحصل في الواقع null ونتيجة.لا يوجد نوع القيمة التي سوف تنتج فارغة عندما محاصر.

هناك متماثلة ومتناظرة دعم علبته.

نوع المعلمة العامة من أجل Nullable يجب أن يكون هو نفسه غير nullable type (أينوع القيمة).هذا هو المحول البرمجي C# تحذير ، و يبدو منطقيا.قل لي لماذا كنت تريد أن تفعل مثل هذا الشيء على أي حال ؟ أنا شخصيا لا أرى أي استخدام القليل مما يعني أن مثل هذا الإعلان حتى.

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

مقتبسة من MSDN:

على Nullable(T) هيكل يدعم فقط باستخدام نوع القيمة كما nullable نوع لأن أنواع المراجع nullable حسب التصميم.

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