2013-08-22 2 views
6

Я реализую интерфейс IDictionary, который имеет параметр object для своего getset.Использовать исключение для несоответствия типов в C#

object this [object key] { get; set; } 

Я хочу, чтобы принудить ключ быть тип строки, так что в моем коде я:

(if key.GetType() != typeof(string)) { 
    // 
} 

Я хочу бросить исключение, когда это произойдет. Однако я не знаю, какое наиболее подходящее исключение использовать в этом случае. Самый близкий, который я могу найти, это ТипInitializationException и ArgumentException. Однако в этом объявлении document указано: «Do throw System.ArgumentException или один из его подтипов, если плохие аргументы передаются члену», что заставляет меня задаться вопросом, является ли мой подходящий вариант использования для него.

Что я должен использовать в своем случае? Должен ли я использовать Assert вместо того, чтобы выбрасывать исключение?

+0

Вы также можете реализовать свое собственное исключение, если хотите. – tnw

+4

Ваш код будет через исключение нулевого указателя, если вы передадите его null. Если вы используете '! (Key is string)', вы получите любое исключение, которое вы выбрали внутри 'if'. – Gabe

+2

Почему не следует вводить ключ в строку в аргументе типа? например IDictionary

ответ

5

ArgumentException является правильным исключением. Весь BCL использует его, и вы тоже. TypeInitializationException не подходит вообще. Он имеет только один вариант использования: метательный статический ctor.

Это, если вы не создаете библиотеку (только внутренний код), вы можете отклониться от этого соглашения, если есть веская причина. Если вы хотите использовать Debug.Assert или какую-то альтернативу, не стесняйтесь это делать.

+0

Я думаю, что комментарий Мэтью - лучший подход к тому, что я делаю. Тем не менее, этот ответ лучше всего подходит для названия моего вопроса, я отмечу это как ответ, чтобы облегчить людям доступ к ним через поиск. – bizi

3

Сначала я считаю, что лучшим решением является Mathhew's; Почему вы просто не используете словарь Generic типа string.

Если вам необходимо применить другой подход, отличный от Code Contracts, это лучший способ сделать это.

Пример: Contract.Requires (key is string); и т. Д. Assert не подходит для этой проблемы, но может применяться ArgumentException.

Благодаря