Ошибка компиляции если switch не учитывает все вар-ты enum
От: ivs13  
Дата: 16.11.10 17:19
Оценка:
Можно ли выдавать ошибку компиляции, если 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  
Дата: 16.11.10 17:35
Оценка:
а смысл?
если можно сделать так:
MyType myType = (MyType) 100;
Re[2]: Ошибка компиляции если switch не учитывает все вар-ты
От: ivs13  
Дата: 16.11.10 19:28
Оценка:
Здравствуйте, Muxa, Вы писали:

M>а смысл?

M>если можно сделать так:
M>
M>MyType myType = (MyType) 100;
M>


Сделать-то можно, но смысл вопроса был в другом. Нужно затем, чтобы при добавлении еще одного типа в enum'е найти все места в программе, где нужно не забыть учесть вновь добавленный тип.
Re[3]: Ошибка компиляции если switch не учитывает все вар-ты
От: samius Япония http://sams-tricks.blogspot.com
Дата: 16.11.10 19:32
Оценка:
Здравствуйте, ivs13, Вы писали:

I>Сделать-то можно, но смысл вопроса был в другом. Нужно затем, чтобы при добавлении еще одного типа в enum'е найти все места в программе, где нужно не забыть учесть вновь добавленный тип.


Обычно подобные вещи решаются этак.
Re: Ошибка компиляции если switch не учитывает все вар-ты en
От: _FRED_ Черногория
Дата: 16.11.10 20:07
Оценка: +1
Здравствуйте, 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
От: SeLo  
Дата: 16.11.10 22:00
Оценка:
ошибку компиляции не знаю как, а вот ошибку рантайма можно вызвать добавлением секции "default: throw new Exception()." Обычно этого хватает
Re: Ошибка компиляции если switch не учитывает все вар-ты en
От: fk0 Россия https://fk0.name
Дата: 17.11.10 04:10
Оценка:
Здравствуйте, ivs13, Вы писали:

I>Можно ли выдавать ошибку компиляции, если switch не учитывает всех возможных вариантов enum?

I>Например, чтобы следующий код не компилировался до тех пор, пока не добавится Type3 в switch.

Можно warning. GCC умеет.
Re: Ошибка компиляции если switch не учитывает все вар-ты en
От: Sinix  
Дата: 17.11.10 06:17
Оценка:
Здравствуйте, 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
От: matumba  
Дата: 17.11.10 08:25
Оценка:
Здравствуйте, ivs13, Вы писали:

I>Можно ли выдавать ошибку компиляции, если switch не учитывает всех возможных вариантов enum?


Можно. Но для этого придётся переписать всё на D.
Re[2]: Ошибка компиляции если switch не учитывает все вар-ты
От: hi_octane Беларусь  
Дата: 17.11.10 08:32
Оценка:
M>Можно. Но для этого придётся переписать всё на D.
В случае .NET скорее на Nemerle, там эта фича тоже искаропки есть.
Re[3]: Ошибка компиляции если switch не учитывает все вар-ты
От: ivs13  
Дата: 17.11.10 08:55
Оценка:
_>В случае .NET скорее на Nemerle, там эта фича тоже искаропки есть.

Проще подождать C# версии ?-надцать, в которой это тоже будет
Re[2]: Ошибка компиляции если switch не учитывает все вар-ты
От: ivs13  
Дата: 17.11.10 09:01
Оценка:
Здравствуйте, fk0, Вы писали:
fk0> Можно warning. GCC умеет.

Я рад за GCC, но каким боком это относится к .NET?
Re: Ошибка компиляции если switch не учитывает все вар-ты en
От: ivs13  
Дата: 17.11.10 09:03
Оценка:
Здравствуйте, ivs13, Вы писали:

Спасибо всем за помощь.
Придется ограничиться runtime'ом и ждать сообщений об ошибках от пользователей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.