Можно ли выдавать ошибку компиляции, если switch не учитывает всех возможных вариантов enum?
Например, чтобы следующий код не компилировался до тех пор, пока не добавится Type3 в switch.
using System;
using System.ComponentModel;
namespace ConsoleApplication1
{
public enum MyType {Unknown, Type1, Type2, Type3};
class Program
{
static void Main(string[] args)
{
MyType myType = MyType.Type2;
switch (myType)
{
case MyType.Unknown: Console.WriteLine("myType is unknown"); break;
case MyType.Type1: Console.WriteLine("myType is Type1"); break;
case MyType.Type2: Console.WriteLine("myType is Type2"); break;
}
Console.ReadKey();
}
}
}
Re: Ошибка компиляции если switch не учитывает все вар-ты en
Здравствуйте, Muxa, Вы писали:
M>а смысл? M>если можно сделать так: M>
M>MyType myType = (MyType) 100;
M>
Сделать-то можно, но смысл вопроса был в другом. Нужно затем, чтобы при добавлении еще одного типа в enum'е найти все места в программе, где нужно не забыть учесть вновь добавленный тип.
Re[3]: Ошибка компиляции если switch не учитывает все вар-ты
Здравствуйте, ivs13, Вы писали:
I>Сделать-то можно, но смысл вопроса был в другом. Нужно затем, чтобы при добавлении еще одного типа в enum'е найти все места в программе, где нужно не забыть учесть вновь добавленный тип.
Здравствуйте, ivs13, Вы писали:
I>Можно ли выдавать ошибку компиляции, если switch не учитывает всех возможных вариантов enum? I>Например, чтобы следующий код не компилировался до тех пор, пока не добавится Type3 в switch.
Нельзя: значения "MyType myType" не огранирчиваются множеством "{Unknown, Type1, Type2, Type3}" Поэтому с енамами "на случай войны" необходимо предусматривать "default:".
Help will always be given at Hogwarts to those who ask for it.
Re: Ошибка компиляции если switch не учитывает все вар-ты en
Здравствуйте, ivs13, Вы писали:
I>Можно ли выдавать ошибку компиляции, если switch не учитывает всех возможных вариантов enum? I>Например, чтобы следующий код не компилировался до тех пор, пока не добавится Type3 в switch.
Можно warning. GCC умеет.
Re: Ошибка компиляции если switch не учитывает все вар-ты en
Здравствуйте, ivs13, Вы писали:
I>Можно ли выдавать ошибку компиляции, если switch не учитывает всех возможных вариантов enum?
1. Можно написать свой Code Analysis Rule.
2. CodeContracts static checking требует дублирования проверки в начале метода:
static void Main()
{
CatchIt(EnumAllCatched.A);
CatchIt(EnumNotAllCatched.A);
CatchIt(EnumAllCatched.C);
// CodeContracts: requires is false: value == EnumNotAllCatched.A || value == EnumNotAllCatched.B || value == EnumNotAllCatched.C
CatchIt(EnumNotAllCatched.D);
}
static void CatchIt(EnumAllCatched value)
{
Contract.Requires(value == EnumAllCatched.A
|| value == EnumAllCatched.B
|| value == EnumAllCatched.C);
switch (value)
{
case EnumAllCatched.A:
break;
case EnumAllCatched.B:
break;
case EnumAllCatched.C:
break;
default:
break;
}
}
static void CatchIt(EnumNotAllCatched value)
{
Contract.Requires(value == EnumNotAllCatched.A
|| value == EnumNotAllCatched.B
|| value == EnumNotAllCatched.C);
switch (value)
{
case EnumNotAllCatched.A:
break;
case EnumNotAllCatched.B:
break;
case EnumNotAllCatched.C:
break;
default:
break;
}
}
Re: Ошибка компиляции если switch не учитывает все вар-ты en