Ich erhalte eine unerwartete NullReferenceException
, wenn ich diesen Code ausführen, jedoch ohne den fileSystemHelper
Parameter (und damit säumige es auf null):Warum funktioniert der Nullkoaleszenzoperator (??) in dieser Situation nicht?
public class GitLog
{
FileSystemHelper fileSystem;
/// <summary>
/// Initializes a new instance of the <see cref="GitLog" /> class.
/// </summary>
/// <param name="pathToWorkingCopy">The path to a Git working copy.</param>
/// <param name="fileSystemHelper">A helper class that provides file system services (optional).</param>
/// <exception cref="ArgumentException">Thrown if the path is invalid.</exception>
/// <exception cref="InvalidOperationException">Thrown if there is no Git repository at the specified path.</exception>
public GitLog(string pathToWorkingCopy, FileSystemHelper fileSystemHelper = null)
{
this.fileSystem = fileSystemHelper ?? new FileSystemHelper();
string fullPath = fileSystem.GetFullPath(pathToWorkingCopy); // ArgumentException if path invalid.
if (!fileSystem.DirectoryExists(fullPath))
throw new ArgumentException("The specified working copy directory does not exist.");
GitWorkingCopyPath = pathToWorkingCopy;
string git = fileSystem.PathCombine(fullPath, ".git");
if (!fileSystem.DirectoryExists(git))
{
throw new InvalidOperationException(
"There does not appear to be a Git repository at the specified location.");
}
}
Wenn ich Schritt den Code im Debugger Single, nachdem ich über den Schritt erste Zeile (mit dem ??
Operator) dann fileSystem
noch den Wert null hat, wie in diesem Bildschirm schnipp gezeigt (Schritt über die nächste Zeile wirft NullReferenceException
):
das ist nicht das, was ich erwartet habe! Ich erwarte, dass der Nullkoaleszenzoperator erkennt, dass der Parameter null ist, und erstellen Sie eine new FileSystemHelper()
. Ich habe diesen Code seit Ewigkeiten gesehen und kann nicht sehen, was damit nicht stimmt.
ReSharper wies darauf hin, dass das Feld nur in dieser einen Methode verwendet wird, also möglicherweise in eine lokale Variable umgewandelt werden könnte ... also habe ich das versucht und rate mal was? Es funktionierte. Also, ich habe meine Lösung, aber ich kann nicht für das Leben von mir sehen, warum der obige Code nicht funktioniert. Ich habe das Gefühl, dass ich gerade dabei bin, etwas Interessantes über C# zu lernen, oder ich habe etwas wirklich Dummes getan. Kann jemand sehen, was hier passiert?
Sie sagen bereits, dass 'fileSystemHelper' in den Methodenparametern' null' ist, ich bin mir nicht sicher, aber es könnte etwas damit zu tun haben. Aber andererseits, vermute ich. – Tico
Sind Sie sicher, dass die NRE nicht von * innerhalb * GetFullPath (ignoriert, was die Uhr zeigt) auftritt? Ich sehe nichts mit dem obigen Code, der zu besagtem Verhalten führen würde. – user2864740
OK, nachdem ich VisualStudio beendet habe, um etwas anderes zu tun, habe ich es neu geladen, alles funktioniert jetzt und ich kann das Problem nicht reproduzieren. Ich denke, dies könnte ein seltsames Caching-Problem mit dem ReSharper Unit Test Runner sein. Ich verwende einen einfachen MSpec-Test, um den Code auszuprobieren. ReSharper erstellt eine Shadow-Kopie der Assembly, wenn Unit-Tests ausgeführt werden. Manchmal scheint die Shadow-Kopie manchmal "hängen zu bleiben". Ich habe es schon ein paar Mal gesehen. Am wahrscheinlichsten war, dass ich tatsächlich alten Code ausführte, obwohl ich alles manuell neu erstellt hatte. Es ist die beste Erklärung, die ich habe ... –