私はこのコードを実行すると、私はfileSystemHelper
パラメータを省略(したがって、nullにそれを不履行)、予期しないNullReferenceException
を取得しています:この状況で、ヌル合体演算子(??)が機能しないのはなぜですか?
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
):
これは私が期待したものではありません! null合体演算子がnullであることを確認し、new FileSystemHelper()
を作成することを期待しています。私は年齢のためにこのコードを見て、何が間違っているか見ることができません。
ReSharperは、フィールドはこの1つのメソッドでのみ使用されると指摘しているので、ローカル変数に変換される可能性があります。出来た。だから、私は修正がありますが、私の人生では上記のコードがうまくいかない理由がわかりません。私はC#について興味深いことを学ぶことの端にいるような気がします。それは本当に何かをやったことです。誰がここで何が起こっているのを見ることができますか?
すでに 'fileSystemHelper'がメソッドのパラメータに' null'と指定されていますが、わかりませんが、それは何か関係があります。しかし、再び、私は推測しています。 – Tico
NREが* GetFullPath内から*発生していないことを確かめていますか?私は上記のコードでは何も言わないと言います。 – user2864740
OK、VisualStudioを終了して何か他のことをしてからリロードしたが、今はすべて動作しているので問題を再現できない。私はこれがReSharperユニットテストランナーの奇妙なキャッシングの問題かもしれません。私は単純なMSpecテストを使ってコードを実行しています。 ReSharperは単体テストを実行しているときにアセンブリのシャドウコピーをとります。時には時にはシャドウコピーが「固まった」ように見えることもあります。だから、おそらく、私は手動ですべてを再構築していたとしても、実際には古いコードを実行していました。それは私が持っている最良の説明です... –