tôi nhận được một bất ngờ NullReferenceException
khi tôi chạy mã này, bỏ qua các tham số fileSystemHelper
(và do đó mặc định nó để null):Tại sao toán tử không hợp nhất (??) hoạt động trong tình huống này?
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.");
}
}
Khi tôi duy nhất bước mã trong trình gỡ lỗi, sau khi tôi bước qua dòng đầu tiên (với các nhà điều hành ??
) sau đó fileSystem
vẫn có giá trị null, như trong ảnh chụp màn hình này (bước trên dòng tiếp theo ném NullReferenceException
):
Đây không phải là những gì tôi mong đợi! Tôi hy vọng toán tử kết hợp null để phát hiện rằng tham số là null và tạo ra một new FileSystemHelper()
. Tôi đã nhìn vào mã này cho các lứa tuổi và không thể nhìn thấy những gì là sai với nó.
ReSharper chỉ ra rằng trường này chỉ được sử dụng trong phương pháp này, vì vậy có khả năng có thể được chuyển đổi thành một biến địa phương ... vì vậy tôi đã thử và đoán những gì? Nó đã làm việc. Vì vậy, tôi đã sửa chữa của tôi, nhưng tôi không thể cho cuộc sống của tôi thấy lý do tại sao mã trên không hoạt động. Tôi cảm thấy như tôi đang ở trên các cạnh của việc học một cái gì đó thú vị về C#, hoặc là tôi đã làm một cái gì đó thực sự câm. Có ai có thể thấy những gì đang xảy ra ở đây không?
Bạn đã nói rằng 'fileSystemHelper' là' null' trong các tham số phương thức, tôi không chắc chắn, nhưng nó có thể có liên quan gì đó với nó. Nhưng sau đó một lần nữa, tôi đoán. – Tico
Bạn có chắc chắn NRE không xảy ra từ * trong * GetFullPath (bỏ qua những gì đồng hồ hiển thị) không? Tôi thấy không có gì với mã ở trên mà sẽ dẫn đến hành vi nói. – user2864740
OK, khi thoát khỏi VisualStudio để làm điều gì đó khác sau đó tải lại nó, mọi thứ đang hoạt động ngay bây giờ và tôi không thể tái tạo vấn đề. Tôi _think_ điều này có thể là một vấn đề bộ nhớ đệm kỳ lạ với Á hậu thử nghiệm đơn vị ReSharper. Tôi đang sử dụng một bài kiểm tra MSpec đơn giản để thực hiện mã. ReSharper mất một bản sao bóng của hội đồng khi chạy thử nghiệm đơn vị và đôi khi, chỉ đôi khi, bản sao bóng có vẻ như bị 'kẹt', tôi đã nhìn thấy nó xảy ra một vài lần trước đây. Rất có thể, tôi đã thực sự chạy mã cũ, mặc dù tôi đã xây dựng lại mọi thứ theo cách thủ công. Đó là lời giải thích tốt nhất mà tôi có ... –