2011-08-15 23 views
13

Tôi đang sử dụng một biểu ternary rất đơn giản trong mã của tôi # C:Bizarre hành vi hành ternary trong trình gỡ lỗi trên nền tảng x64

helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData(); 

Trong cả hai trường hợp, các chức năng trên mỗi con đường của biểu thức trả về một không null đối tượng, nhưng nếu tôi nhìn vào kết quả trong trình gỡ lỗi, nó là null cho đến khi tôi tham khảo nó trong các mã như sử dụng một khẳng định:

Debug.Assert(helperClass.SomeData != null); 

này chỉ xuất hiện để xảy ra nếu tôi sử dụng một "x64" hay " Bất kỳ CPU "thiết lập nền tảng trong chế độ gỡ lỗi. Nó ổn ở chế độ "x86".

Tôi cố gắng rất thận trọng trước khi giả sử tôi đã tìm thấy lỗi trong trình biên dịch hoặc trình gỡ lỗi, nhưng tôi không thể tìm thấy bất kỳ lời giải thích nào khác cho hành vi này.

Dưới đây là một lớp học đầy đủ để làm một repro, chỉ cần gọi SomeClass.SomeAction() trong trình gỡ lỗi trong chế độ x64 và bước qua để xem nó:

public class SomeClass { 
    public bool HasData; 
    public object SomeData; 

    private SomeClass() { 
     HasData = false; 
    } 

    public static void SomeAction() { 
     var helperClass = new SomeClass(); 
     // Exhibits weird debugger behavior of having helperClass.SomeData = null after this line: 
     helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData(); 

     // Note that trying helperClass.SomeData.ToString() returns a debugger error saying SomeData is null 

     // But this code is just fine 
     //if(helperClass.HasData) { 
     // helperClass.SomeData = GetSomeData(); 
     //} 
     //else { 
     // helperClass.SomeData = GetSomeOtherData(); 
     //} 

     // In both cases though, after this line things are fine: 
     Debug.Assert(helperClass.SomeData != null); 
    } 

    private static object GetSomeData() { 
     return new object(); 
    } 

    private static object GetSomeOtherData() { 
     return new object(); 
    } 
} 

Tôi có thiếu một cái gì đó hoặc đây là một lỗi trong trình gỡ lỗi x64? Tôi đang sử dụng chế độ gỡ lỗi để không có tối ưu hóa.

+2

Lưu ý rằng * biểu tượng gỡ lỗi được tạo * và * tối ưu hóa được tạo * thực sự là trực giao. Nó là hợp pháp, mặc dù hơi khác thường, để bật các biểu tượng gỡ lỗi và tối ưu hóa cùng một lúc. Có thể muốn kiểm tra kỹ xem bạn có đang ở trong cấu hình lẻ không. –

+0

Hộp kiểm "Tối ưu hóa mã" trong tab "Xây dựng" không được chọn cho cấu hình hoạt động (Debug/x64) của tôi. Tôi có nên kiểm tra ở đâu khác không? –

+0

Không; âm thanh như thế không phải là vấn đề. –

Trả lời

9

Lấy lời khuyên Eric Lippert rằng đây có lẽ là một lỗi, tôi đã đệ đơn kiện chính thức lỗi Connect cho vấn đề này: https://connect.microsoft.com/VisualStudio/feedback/details/684202

Cảm ơn tất cả mọi người vì phản hồi của bạn!

CẬP NHẬT: Họ quay lại với tôi và cho biết họ đã sửa trường hợp góc này trong phiên bản tiếp theo của trình biên dịch. Hoan hô! :)

4

với tôi điều này dường như không phải là một lỗi trong trình gỡ lỗi nhưng có thể các trình biên dịch ...

khi thay đổi mã để

{ helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData(); } 

IL tạo ra là khác nhau và trình gỡ lỗi hoạt động như dự kiến ​​...

+0

Tại sao bạn phải đặt {} xung quanh nó? –

+0

Tôi không nói bạn phải ... chỉ là một cái gì đó dường như làm việc sau khi Reflector gaved tôi một số mã lạ khi tháo dòng đó ... – Yahia

+0

Nó có vẻ giống như một lỗi (có lẽ chỉ trong trình biên dịch như bạn đề nghị). Tôi đang làm việc xung quanh nó bằng cách chuyển đổi nó thành câu lệnh if mặc dù ReSharper nghĩ rằng tôi là một thằng ngốc để làm điều đó :) –

Các vấn đề liên quan