Почему не существует enum-расширений в C #? - PullRequest
0 голосов
/ 13 октября 2011

Я думаю, что многие разработчики на C # столкнулись с такой проблемой: в стандартной библиотеке .net и некоторых стандартных классах и их методах работы с ними есть некоторые перечисления.Но если вы хотите расширить это перечисление, добавив некоторые поля, что невозможно, но это может эффективно упростить процесс разработки и не помешает работе этих стандартных классов.Я описываю это на конкретном примере: в пространстве имен System.Diagnostics есть перечисление TraceOptions, и оно используется TraceListeners.Давайте я хочу разработать Listener с некоторыми дополнительными опциями (например, AssemblyName и т. Д.).Теперь я должен создать новый enum, содержащий все мои дополнительные опции, которые дополняют опции из enum TraceOptions.Затем добавить новое свойство ExtraTraceOptions для моего слушателя.Но что, если я могу написать что-то вроде этого:

enum MyExtraEnum : TraceOptions
{
  AssemblyName = 128
}

MyExtraEnum расширит TraceOptions новыми полями, которые не должны пересекаться с полями TraceOptions ни по именам, ни по значениям.Тогда я могу использовать TraceOptions с новыми полями, такими как:

     TraceOptions t = TraceOptions.AssemblyName; (IntelliSense may display that this 
field is extended field from MyExtraEnum enumeration)

Я понимаю, что это может повредить существующий код, используя перечисление TraceOptions, но если я уверен, что этого не произойдет, и вся ответственность за использование таких функций лежитна меня.

Что вы делаете с таким будущим?

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Это не очень хорошая идея для меня. Так что теперь C # 6 вышел, и TraceOptions имеет новую функцию: SomeFoo = 128. Или, может быть, AssemblyName = 127. И теперь у вас есть коллизия, которую (в отличие от обычного подкласса) поставщик TraceOptions не ожидает.

Перечисления предоставляют ограниченный набор опций, которые поддерживает автор перечисления. Заявление о том, что вы берете на себя полную ответственность, недостаточно. Это все равно, что спросить, что все переменные-члены будут публичными, заявив, что вы никогда не будете их неправильно использовать. Это просто небезопасный подход к программированию.

0 голосов
/ 13 октября 2011

Вы не можете наследовать от перечисления, все перечисления неявно запечатаны. Так что нет простого способа добавить дополнительные значения в перечисление (если это то, что вы пытаетесь сделать). Вам нужно будет определить новое перечисление.

Если вы хотите добавить дополнительные методы в перечисление, вы можете использовать методы расширения, но это единственный способ, которым вы можете расширить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...