2015-09-04 17 views
20

Tôi nhận ra cách thích hợp để xử lý các loại nullable là sử dụng thuộc tính HasValue. Nhưng tôi muốn biết tại sao tuyên bố chuyển đổi sau đây phá vỡ trên trường hợp null thay vì mặc định. Sử dụng VS2015 C# 4.0. Một máy tính đang sử dụng VS2010 C# 4.0 không có vấn đề tương tự.Bật Nullable Boolean: trường hợp chuyển thành null khi giá trị là true

private void Testing() 
    { 
     bool? boolValue = true; 

     switch (boolValue) 
     { 
      case null: 
       break; //even though value is true, code runs here 

      default: 
       break; 
     } 
    } 

Sửa: Hành vi được quan sát với bất kỳ Nullable nếu chỉ case Nulldefault được chỉ định.

+0

Tôi không nhận được hành vi này trên VS2013 –

+0

Tôi đoán biểu tượng của bạn đã lỗi thời và không chạy những gì bạn cho là đang chạy hoặc có thể trình biên dịch đang thực hiện một số điều tối ưu hóa lạ và chải hai khối bằng nhau . Có lẽ thêm một số mã thực tế trong đó và xem nó làm gì .. –

+0

Tôi không nhận được hành vi đó trong năm 2010. – thewisegod

Trả lời

5

Đây không phải là câu trả lời, tôi chỉ đang chia sẻ mã IL được tạo bởi VS2013 và VS2015.

gốc C# code:

public void Testing() 
{ 
    bool? boolValue = true; 

    switch (boolValue) 
    { 

     case null: 

      Console.WriteLine("null"); 

      break; 

     default: 
      Console.WriteLine("default"); 

      break; 
    } 
} 

VS2013 IL (dịch ngược):

public void Testing() 
{ 
    bool? boolValue = new bool?(true); 
    bool valueOrDefault = boolValue.GetValueOrDefault(); 
    if (boolValue.HasValue) 
    { 
     Console.WriteLine("default"); 
    } 
    else 
    { 
     Console.WriteLine("null"); 
    } 
} 

VS2015 IL (dịch ngược):

public void Testing() 
{ 
    bool? flag = new bool?(true); 
    bool? flag2 = flag; 
    bool? flag3 = flag2; 
    if (flag3.HasValue) 
    { 
     bool valueOrDefault = flag3.GetValueOrDefault(); 
    } 
    Console.WriteLine("null"); 
} 
+0

đối với tôi chỉ có một biến 'nullable2'. không flag1,2,3. nhưng có vẻ như phần mặc định không biên dịch chút nào. vấn đề là cho tất cả các loại nullable –

+0

Có lẽ nó cũng phụ thuộc vào trình giải mã. Tôi đang sử dụng ILSpy –

+0

Nhưng tại sao nó sẽ làm việc cho vendettamit trong VS2015? – MikeG

13

Đây sẽ là một câu trả lời rất ngắn : Bạn chỉ cần nhấn Roslyn bug #4701, được báo cáo cách đây hai tuần.

Cột mốc được đặt thành 1.1, do đó, ngay bây giờ bạn sẽ phải giải quyết vấn đề này với mệnh đề riêng biệt là if, trong khi chờ bản cập nhật trình biên dịch tiếp theo.

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