لماذا هو قيم الفارغة ليس صالحة السمة المخصصة المعلمة عندما T هو؟

StackOverflow https://stackoverflow.com/questions/1416126

  •  06-07-2019
  •  | 
  •  

سؤال

وإذا كان لدي التعداد مثل هذا

public enum Hungry
{
    Somewhat,
    Very,
    CouldEatMySocks
}

وسمة مخصصة مثل هذا

public class HungerAttribute : Attribute
{
    public Hungry HungerLevel { get; set; }
    public Hungry? NullableHungerLevel { get; set; }
}

وأستطيع أن أفعل ذلك

[Hunger(HungerLevel = Hungry.CouldEatMySocks)]
public class Thing1

ولكن لا أستطيع أن أفعل هذا

[Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)]
public class Thing2

فهو يولد خطأ تقول "" NullableHungerLevel 'ليس حجة سمة مسماة صالحة لأنه لا يصح نوع المعلمة السمة ".

لماذا لا يسمح؟ أنا أفهم أن الأساس هو فقط وليس على قائمة أنواع مقبولة. يبدو أن أنواع صالحة لتكون البدائيون، تتضمن التعدادات، سلسلة، والنوع، والمصفوفات واحد الأبعاد من الأنواع السابقة.

هل هذا مجرد القاعدة القديمة التي لم يتم تحديثها عندما جاء قيم الفارغة على طول؟

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

المحلول

وHungry? تساوي Nullable<Hungry>، والذي يعني من حيث أن

[Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)]

ويساوي

[Hunger(NullableHungerLevel = new Nullable<Hungry>(Hungry.CouldEatMySocks))]

ومنذ يمكنك فقط استخدام قيم ثابتة في الحجج سمة مسماة سوف تضطر الى اللجوء الى حل إهتز ل.

نصائح أخرى

لالتفاف على هذا خلق مهيئ آخر في السمة الخاصة بك:

class Program
{
  [Hunger()]
  static void Main(string[] args)
  {
  }

  public sealed class HungerAttribute : Attribute
  {        
    public Hungry? HungerLevel { get; }
    public bool IsNull => !_HungerLevel.HasValue;

    public HungerAttribute()
    {
    }

    //Or:
    public HungerAttribute(Hungry level)
    {
      HungerLevel = level;
    }
  }

  public enum Hungry { Somewhat, Very, CouldEatMySocks }
}

وأنا أفهم أنك لا تنوي استخدام الممتلكات على حد سواء.

وسمات قد يكون المعلمات الأوليات كما فقط، تشير typeof تعبيرات والتعبير صفيف الخلق.

وقيم الفارغة غير البنية.

لذلك غير مسموح به هناك.

وأظن أن شكل ملف التجميع في حد ذاته لا يسمح تخزين أنواع معقدة مثل البنيات في المكان الذي تنسب يتم تخزين القيم.

وأنا لا أعرف من أي خطط لتغيير ذلك. ولكن لا أستطيع أن أشرح لماذا هذا القيد موجود.

وبدلا من إنشاء تعداد قيم الفارغة، يمكنك إنشاء القيمة الافتراضية لهذا التعداد. التعداد اختيار الافتراضي من قيمة 1ST، لذلك تعيين التعداد الخاصة بك مثل هذا

public enum Hungry
{
    None,
    Somewhat,
    Very,
    CouldEatMySocks
}

في التعليمات البرمجية التي يمكن أن تفعل هذا للتحقق من باطل

if(default(Hungry) == HungerLevel)//no value has been set
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top