Betrachten Sie dieses Stück Code (auch in Ideone):Ist C# SortedList <TKey, TValue> .Keys.Contains-Methode, die eine Null-Ausnahme wirft, eine gute Sache?
using System;
using System.Collections.Generic;
class Program {
static void Main() {
Console.WriteLine(HasItem(new List<string>(), null));
try {
Console.WriteLine(HasItem(new SortedList<string, int>().Keys, null));
} catch (ArgumentNullException) {
Console.WriteLine("ArgumentNullException");
}
}
public static bool HasItem(ICollection<string> collection, string item) {
return collection.Contains(item);
}
}
Problem
Der Ausgang ist
Falsch
Argument
Nach d Igling durch, wie funktioniert die SortedList<TKey, TValue>
funktioniert Ich fand, dass dieser Aufruf entspricht Aufruf SortedList<TKey, TValue>.ContainsKey(TKey key)
Methode, die eine ArgumentNullException
dokumentiert hat.
Auf der anderen Seite, die Dokumentation für die ICollection<T>.Contains
Methode heißt es:
Returns:
true
, wenn das Element in denICollection<T>
gefunden wird; andernfallsfalse
.
Nun, null
ist kein Teil der zweiten Sammlung in meinem Beispiel, so erwarte ich false
zurückgegeben werden. Eine ArgumentNullException
ist eine Verletzung der Schnittstelle und somit ein Fehler.
Was ist eine Problemumgehung für das in Produktionscode? Die Typüberprüfung ist sehr hässlich, da die .Keys
-Eigenschaft eine Instanz einer privaten generischen geschachtelten Klasse zurückgibt, und ich habe keine anderen Ideen. Plus, Typprüfung ist ein wirklich böser Code-Geruch.
Ich möchte Ihre Probleme haben :-) – Legends
> Was ist eine Problemumgehung dafür im Produktionscode? Auch ein bisschen böse, aber fangen Sie die Ausnahme und geben Sie 'false' zurück. – Jay
@Jay danke, ja, das ist eine Möglichkeit, aber es ist zu breit, leider - ich will nur die 'SortedList' Fall – Dethariel