Дело в том, что вы можете надеяться, что, имея параметр типа BookCategory, у вас всегда будет значимая категория книги. Это не тот случай. Я мог бы позвонить:
BookCategory weirdCategory = (BookCategory) 123456;
Test(weirdCategory);
Если перечисление предназначено для представления общеизвестного набора значений, не следует ожидать, что код будет разумно обрабатывать значение за пределами этого общеизвестного набора. Тест проверяет, подходит ли аргумент первым.
Я бы лично изменил логику, хотя:
public void Test(BookCategory cat)
{
if (!Enum.IsDefined(typeof(BookCategory), cat))
{
throw new ArgumentOutOfRangeException("cat");
}
}
В C # 3 это легко сделать с помощью метода расширения:
// Can't constrain T to be an enum, unfortunately. This will have to do :)
public static void ThrowIfNotDefined<T>(this T value, string name) where T : struct
{
if (!Enum.IsDefined(typeof(T), value))
{
throw new ArgumentOutOfRangeException(name);
}
}
Использование:
public void Test(BookCategory cat)
{
cat.ThrowIfNotDefined("cat");
}