sto ricevendo un inaspettato NullReferenceException
quando si esegue questo codice, omettendo il parametro fileSystemHelper
(e quindi inadempiente a NULL):Perché l'operatore coalescente null (??) non funziona in questa situazione?
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.");
}
}
Quando ho solo passo il codice nel debugger, dopo faccio un passo sopra la prima linea (con l'operatore ??
) allora fileSystem
ha ancora il valore nullo, come mostrato in questa schermata snip (scavalcando la riga successiva tiri NullReferenceException
):
questo non è quello che mi aspettavo! Mi aspetto che l'operatore null coalescente identifichi che il parametro è nullo e crea un new FileSystemHelper()
. Ho osservato questo codice per anni e non riesco a vedere cosa c'è di sbagliato in esso.
ReSharper ha sottolineato che il campo è utilizzato solo in questo metodo, quindi potrebbe potenzialmente essere convertito in una variabile locale ... quindi l'ho provato e indovina cosa? Ha funzionato. Quindi, ho la mia correzione, ma non posso per la vita di me vedere perché il codice sopra non funziona. Mi sento come se fossi al limite di imparare qualcosa di interessante su C#, o quello o ho fatto qualcosa di veramente stupido. Qualcuno può vedere cosa sta succedendo qui?
Si sta già affermando che 'fileSystemHelper' è' null' nei parametri del metodo, non sono sicuro, ma potrebbe avere qualcosa a che fare con esso. Ma poi di nuovo, sto indovinando. – Tico
Sei sicuro che la NRE non si verifica * all'interno * di GetFullPath (ignorando ciò che mostra l'orologio)? Non vedo nulla con il codice di cui sopra che comporterebbe detto comportamento. – user2864740
OK, dopo essere uscito da VisualStudio per fare qualcos'altro, l'ho ricaricato, tutto funziona ora e non riesco a riprodurre il problema. Credo che questo potrebbe essere un problema di memorizzazione nella cache con il runner di prova dell'unità ReSharper. Sto usando un semplice test MSpec per esercitare il codice. ReSharper esegue una copia shadow dell'assembly durante l'esecuzione dei test delle unità e talvolta, a volte, la copia shadow sembra bloccata, l'ho vista accadere un paio di volte prima. Quindi, molto probabilmente, stavo effettivamente eseguendo il vecchio codice, anche se avevo ricostruito manualmente tutto. È la migliore spiegazione che ho ... –