Warum löst diese String-Erweiterungsmethode keine Ausnahme aus?
Ich habe eine C # -Stringerweiterungsmethode, die ein @ zurückgeben solltIEnumerable<int>
aller Indizes eines Teilstrings innerhalb eines Strings. Es funktioniert einwandfrei für den beabsichtigten Zweck und die erwarteten Ergebnisse werden zurückgegeben (wie durch einen meiner Tests bestätigt, obwohl nicht der folgende), aber ein anderer Komponententest hat ein Problem damit festgestellt: Es kann keine Nullargumente verarbeiten.
Hier ist die Erweiterungsmethode, die ich teste:
public static IEnumerable<int> AllIndexesOf(this string str, string searchText)
{
if (searchText == null)
{
throw new ArgumentNullException("searchText");
}
for (int index = 0; ; index += searchText.Length)
{
index = str.IndexOf(searchText, index);
if (index == -1)
break;
yield return index;
}
}
Hier ist der Test, der das Problem gemeldet hat:
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Extensions_AllIndexesOf_HandlesNullArguments()
{
string test = "a.b.c.d.e";
test.AllIndexesOf(null);
}
Wenn der Test mit meiner Erweiterungsmethode ausgeführt wird, schlägt dies mit der Standardfehlermeldung fehl, dass die Methode "keine Ausnahme ausgelöst hat".
Das ist verwirrend: Ich habe deutlich @ übergebnull
in die Funktion, aber aus irgendeinem Grund der Vergleichnull == null
kehrt zurückfalse
. Daher wird keine Ausnahme ausgelöst und der Code wird fortgesetzt.
Ich habe bestätigt, dass dies kein Fehler im Test ist: beim Ausführen der Methode in meinem Hauptprojekt mit einem Aufruf vonConsole.WriteLine
im Null-Vergleichif
block, nichts wird auf der Konsole angezeigt und keine Ausnahme wird von @ abgefangcatch
block füge ich hinzu. Außerdem mitstring.IsNullOrEmpty
Anstatt von== null
hat das gleiche Problem.
Warum schlägt dieser vermeintlich einfache Vergleich fehl?