我發現了意想不到的NullReferenceException
當運行此代碼,省略fileSystemHelper
參數(因此默認爲null):爲什麼在這種情況下空合併運算符(?)不起作用?
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值,如本屏幕剪斷(步過的下一行拋出NullReferenceException
):
這不是我所期待的!我期待空合併運算符發現該參數爲空,並創建一個new FileSystemHelper()
。我已經盯着這段代碼很長時間了,看不出它有什麼問題。
ReSharper指出該字段僅用於這一個方法,所以可能會被轉換爲局部變量...所以我試過了,猜猜是什麼?有效。所以,我有我的修復,但我不能爲我的生活看到爲什麼上面的代碼不起作用。我覺得我處於學習C#有趣的事情的邊緣,無論是我還是做了一些非常愚蠢的事情。任何人都可以看到這裏發生了什麼?
您已經在方法參數中聲明'fileSystemHelper'爲'null',我不確定,但它可能與它有關。但是,我再次猜測。 – Tico
您確定NRE不會出現在* GetFullPath中*(忽略手錶顯示的內容)?我沒有看到會導致上述行爲的上述代碼。 – user2864740
好吧,退出VisualStudio做其他事情然後重新加載它,現在一切正常,我不能再現問題。我認爲這可能是ReSharper單元測試運行器存在的一個奇怪的緩存問題。我正在使用簡單的MSpec測試來執行代碼。在運行單元測試時,ReSharper會獲取程序集的影子副本,有時候,影子副本有時會「卡住」,我之前已經看到它發生過幾次。所以很可能,我實際上正在運行舊代碼,儘管我已經手動重建了所有內容。這是我最好的解釋... –