PL / SQL жалуется, что TRUE не является допустимым идентификатором или переменной. Настройте локальную переменную, установите ее в TRUE и передайте ее в функцию get_something.
Я подозреваю, что Вы можете быть в состоянии сделать его немного быстрее путем компиляции делегата, чтобы сделать преобразование для Вас, такой, что это не требует упаковки и распаковывания. Дерево выражений может быть самым простым способом сделать это при использовании.NET 3.5. (Вы использовали бы это в своем примере EnumArray.)
Лично я очень испытал бы желание использовать Ваш const int
решение. Это не похоже на.NET, обеспечивает проверку перечисления значений так или иначе по умолчанию - т.е. Ваши вызывающие стороны могли всегда бросать int.MaxValue
к Вашему перечислимому типу, и Вы получите ArrayIndexException (или безотносительно). Так, учитывая относительное отсутствие защиты / безопасность типов Вы уже добираетесь, ответ постоянной величины обращается.
, Надо надеяться, Marc Gravell приедет через минуту для изложения в деталях скомпилированного делегата преобразования идея хотя...
Если бы Ваш EnumArray не был универсален, но вместо этого явно взял индексатор StatType то - тогда Вы были бы в порядке. Если бы это не желательно, то я, вероятно, использовал бы константу, приближаются ко мне. Однако быстрый тест с передачей в Func< T, E> шоу никакое заметное различие по сравнению с прямым доступом.
public class EnumArray<T, E> where E:struct {
private T[] _array;
private Func<E, int> _convert;
public EnumArray(int size, Func<E, int> convert) {
this._array = new T[size];
this._convert = convert;
}
public T this[E index] {
get { return this._array[this._convert(index)]; }
set { this._array[this._convert(index)] = value; }
}
}
Если бы у Вас есть много наборов фиксированного размера, то, вероятно, было бы легче обернуть Ваши свойства в объекте, чем плавание []:
public class Stats
{
public float Foo = 1.23F;
public float Bar = 3.14159F;
}
Раздавание объекта даст Вам безопасность типов, краткий код и постоянно-разовый доступ, который Вы хотите.
И если Вы действительно потребность использовать массив, его достаточно легкий добавить ToArray () метод, который отображает свойства Вашего объекта к плаванию [].
перечисления, как предполагается, безопасны с точки зрения типов. Если Вы используете их в качестве индекса массива, Вы фиксируете и тип и значения перечисления, таким образом, Вы не обладаете никаким преимуществом по объявлению статического класса международных констант.
Я не полагаю, что существует любой способ добавить неявный оператор преобразования к перечислению, к сожалению. Таким образом, необходимо будет или жить с ужасными преобразованиями типа или просто использовать статический класс с consts.
Вот вопрос о StackOverflow, который обсуждает больше на неявном операторе преобразования:
мы можем определить неявные преобразования перечислений в c#?
Я не на 100% знаком с C#, но я видел, что неявные операторы раньше отображали один тип на другого прежде. Можно ли создать неявный оператор для Перечислимого типа, который позволяет Вам использовать его в качестве интервала?