Я получаю неожиданный NullReferenceException
, когда я запускаю этот код, опуская параметр fileSystemHelper
(и, следовательно, по умолчанию его не имеет значения):
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.");
}
}
Когда я нахожу один шаг кода в отладчике, после того, как я перехожу через первую строку (с оператором ??
), тогда fileSystem
все еще имеет значение null, как показано на этом экране snip (переход по следующей строке бросает NullReferenceException
):
Это не то, что я ожидал! Я ожидаю, что оператор нулевого коалесцирования обнаружит, что параметр имеет значение null и создает new FileSystemHelper()
. Я давно уставился на этот код и не вижу, что с ним не так.
ReSharper указал, что поле используется только в этом методе, поэтому его можно было бы преобразовать в локальную переменную... поэтому я попытался это и угадал, что? Это сработало. Итак, у меня есть исправление, но я не могу, чтобы жизнь меня поняла, почему код выше не работает. Я чувствую, что я нахожусь на грани изучения чего-то интересного о С#, либо это, либо я сделал что-то действительно немое. Может ли кто-нибудь увидеть, что здесь происходит?