این مطلب رو با یک مثال شروع می کنم:
enum E:byte{sat,sun=2,mon,tue=8};
نوع پیش فرض در enum نوع int است ولی می توان شبیه مثال بالا نوع های دیگر را به غیر از char به آن اختصاص داد.
با صفت FlagsAttribute می توان کارکرد enum را به طرز جالبی تغییر داد:
[FlagsAttribute]
enum E{sat=0,sun=1,mon=2,tue=4};
for(int i=0;i<4;i++){
Console.WriteLine(((E)i).ToString());
}
جالب اینجاست که هرجا که مقدار معادل متغیرشمارنده حلقه (i) در enum وجود نداشته باشد، ثابت های دیگر را طوری با هم ترکیب می کند تا آن مقدار بدست بیاید. البته باید دقت شود که حتما شماره گذاری عناصر enum توانی از 2 باشد. و از صفت FlagsAttribute قبل از تعریف نوع شمارشی (enum) استفاده شود.
درست مثل هر ثابت دیگری، همه مراجع به مقادیر مختلف enum، به لیترال های عددی در زمان کامپایل تبدیل خواند شد.
ظاهرا صفت Flags با FlagsAttribute جز در نام صفت تفاوتی ندارد.
اضافه کردن مقادیر اضافی به نسخه های جدید enum ها، یا تغییر مقادیر اعضای enum در نسخه جدیدش می تواند باعث مشکلاتی برای کد های مستقل ایجاد کند. مقادیر شمارشی اغلب در بیان switch استفاده می شود. اگر عناصر اضافی به نوع enum اضافه شده باشد، آزمایش default می تواند بطور ناخاسته درست در بیاید.
اگر برنامه نویسان دیگر از کد شما استفاده خواهند کرد، شما باید راهنمایی در مورد اینکه وقتی عناصر جدید به نوع enum اضافه می شود،کدشان چگونه عکس العمل نشان دهد، ارائه دهید.
اکیدا پیشنهاد می شود که مقادیر داخل نوع شمارشی از صفر شروع شود؛ زیرا:
وقتی شما یک شئ از این نوع می سازید، نام شئ نشان دهنده مقدار پیش فرض آن است و مقدار پیش فرض مقداری است که در داخل enum مقدار صفر دارد.
مثال:
enum Day:Byte{sat=1,sun=2,fri=0};
Day TestDay=default(Day);
Console.WriteLine(TestDay.ToString());
تکه کد بالا "fri" را روی نمایشگر نشان خواهد داد.
همه ی enum ها نمونه هایی از کلاس System.Enum هستند و از این کلاس ارث بری دارند. اما شما نمی توانید کلاس جدیدی از System.Enum مشتق کنید.