مصائد أنواع القيم القابلة للـ null في C#: عندما لا يكون T? ما تعتقد
2025-08-29
يؤدي إعادة استخدام بناء الجملة `T?` في C# لكلا النوعين القابل للـ null من أنواع القيم والمرجعية إلى حدوث ارتباك. بالنسبة لأنواع القيم، فإن `T?` هو سكر نحوي لـ `Nullable`، ويمثل أنواعًا متميزة. ومع ذلك، بالنسبة لأنواع المرجع، فإن `T?` هو مجرد علامة على النية؛ بعد التجميع، يكون `T?` و `T` من نفس النوع. هذه الاختلافات تؤدي إلى أخطاء في التجميع عند كتابة طرق عامة. توضح المقالة هذه المشكلة باستخدام طريقة `SelectNotNull` التي تحاكي `List.choose` من F#. الحل يتضمن تحميل طرق زائد باستخدام قيود النوع (`where TR : class` و `where TR : struct`) لإزالة الغموض بين أنواع القيم والمرجع. على الرغم من حل المشكلة، إلا أن التصميم لا يزال غير أنيق.
التطوير
أنواع قابلة للـ null