2013-08-22 12 views
6

Sto implementando un'interfaccia IDictionary, che ha il parametro object per il suo getset.Utilizzare l'eccezione per la mancata corrispondenza del tipo in C#

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

voglio rispettare la chiave per essere il tipo di stringa, quindi nel mio codice che faccio:

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

voglio un'eccezione quando questo accada. Tuttavia non so quale sia l'eccezione più appropriata da utilizzare in questo caso. Il più vicino che riesco a trovare è TypeInitializationException e ArgumentException. Tuttavia, è indicato in questo document: "Esegui System.ArgumentException o uno dei suoi sottotipi se gli argomenti non validi vengono passati a un membro", il che mi fa pensare se il mio sia il caso d'uso corretto per questo.

Cosa devo usare il mio caso? Devo usare Assert invece di lanciare Eccezione?

+0

È anche possibile implementare la propria eccezione, se lo si desidera. – tnw

+4

Il codice passerà attraverso un'eccezione di puntatore nullo se lo si passa nullo. Se usi '! (Chiave è una stringa)', otterrai qualunque eccezione tu lanci all'interno di 'if'. – Gabe

+2

Perché non imporre la chiave per essere una stringa nell'argomento tipo? per esempio. IDictionary

risposta

5

ArgumentException è l'eccezione corretta. L'intero BCL lo usa e così dovresti. TypeInitializationException non si adatta affatto. Ha solo un caso d'uso: un ctoring statico.

Detto questo, se non si produce una libreria (solo codice interno) è possibile deviare da tale convenzione se c'è una buona ragione. Se si desidera utilizzare uno Debug.Assert o qualche alternativa, sentitevi liberi di farlo.

+0

Penso che il commento di Matthew sia l'approccio migliore per quello che sto facendo. Tuttavia, questa risposta è la migliore corrispondenza per il titolo della mia domanda, contrassegnerò questa come risposta per rendere più facile per le persone venire qui attraverso la ricerca. – bizi

3

Prima di tutto, la soluzione migliore è quella di Mathhew; Perché non stai semplicemente usando il dizionario generico di tipo stringa.

Se è necessario applicare un altro approccio rispetto a Contratti di codice è il modo migliore per farlo.

Esempio: Contract.Requires (la chiave è stringa); ecc. L'assert non è adatto a questo problema, ma è possibile applicare ArgumentException.

Grazie

Problemi correlati