Я не уверен, почему это правило является настолько ограничительным, поскольку аргумент должен быть одним из параметров метода
Это потому, что все, что вы там передадите, будет опубликовано в ParamName
свойство исключения, которое определяется как
Получает имя параметра, вызывающего это исключение.
Теперь, если что бы там ни было , а не имя параметра, все может запутаться для любого, кто обрабатывает исключение. В некоторых случаях ArgumentException
и ParamName
могут даже оцениваться с помощью отражения, которое может завершиться ошибкой, если имя параметра не найдено.
Если вы действительно хотите предоставить пользовательское сообщение для ArgumentException
, вы можете использовать конструктор , который принимает пользовательское сообщение и исключение (и передает null
для исключения).
Однако , как ваш исключение не указывает на недопустимый аргумент , я бы сказал, что ArgumentException
не является правильным исключением для использования. Вы генерируете исключение, потому что свойство вашего объекта имеет недопустимое значение, то есть потому, что ваш объект находится в недопустимом состоянии. Правильное исключение для выброса в этом случае - InvalidOperationException
, которое определяется как
Исключение, которое выбрасывается, когда вызов метода недопустим для текущего состояния объекта.
(Обратите внимание, что ваш код, находящийся в получателе свойства, считается "вызовом метода".)
Как отступление, даже если значение enum было аргументом, ArgumentException
может быть не самым подходящим выбором. Существует InvalidEnumArgumentException
, который специально предназначен для использования со значениями перечисления.