15

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.");
            }
        }

デバッガーでコードを 1 ステップ実行すると、最初の行を (??演算子を使用して) ステップ オーバーした後fileSystemも、この画面の抜粋に示すように値が null のままです (次の行をステップ オーバーすると、 がスローされますNullReferenceException)。 null が null でないのはいつですか?

これは私が期待したものではありません!null合体演算子がパラメータがnullであることを発見し、new FileSystemHelper(). 私はこのコードを何年も見つめてきましたが、何が問題なのかわかりません。

ReSharper は、フィールドはこの 1 つのメソッドでのみ使用されるため、潜在的にローカル変数に変換される可能性があると指摘しました。出来た。それで、私は修正しましたが、私の人生では、上記のコードが機能しない理由を理解できません。C# について何か面白いことを学ぼうとしているような気がします。ここで何が起こっているか、誰でも見ることができますか?

4

2 に答える 2

1

他の誰かがこの質問で同じ問題を経験しました。興味深いことに、フォーマットも使用していthis._field = expression ?? new ClassName();ます。値を書き出すと正しい結果が得られるように見えたため、デバッガーに何らかの問題がある可能性があります。

デバッグ/ログ コードを追加して、割り当て後にフィールドの値を表示し、接続されたデバッガーの異常を排除してみてください。

于 2013-10-14T01:41:07.340 に答える