2015-12-04 28 views
9

Tôi vừa mới nâng cấp lên VS2015.1 và gặp sự cố trình biên dịch khi cố biên dịch một trong các dự án của mình. Nếu bạn đặt mã repo sau đây trong một ứng dụng giao diện điều khiển (và thêm một tham chiếu đến moq.dll), mã trong dòng 12 sẽ làm hỏng trình biên dịch của tôi. Nó dường như xảy ra trong một cuộc gọi viết lại Roslyn lamdba.Tại sao Roslyn gặp sự cố khi cố gắng viết lại lambda này? (Cập nhật Visual Studio 2015 1)

using System.Collections.Generic; 
using System.Linq; 
using Moq; 

namespace RoslynError 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     var mockRepo = new MockRepository(MockBehavior.Strict); 
     var obj = mockRepo.OneOf<DTO>(x => x.Value == (OptionEnum?)null); 
    } 
    } 

    class DTO 
    { 
    public DTO(OptionEnum? enumVal) 
    { 
     Value = enumVal; 
    }  

    public OptionEnum? Value; 
    } 

    enum OptionEnum 
    { 
    NotSpecified  
    } 
} 

Bất kỳ ai biết tại sao sự cố xảy ra?

+0

Tham chiếu đến Moq khó có liên quan. Tôi nghĩ điều quan trọng là mũi tên lambda sẽ được chuyển đổi thành một cây biểu thức (thuộc loại 'Biểu thức >'), không thành một cá thể đại biểu đơn giản (thuộc loại 'Func '). –

Trả lời

9

Ví dụ đơn giản sau đây cũng tái tạo vấn đề, trong đó có liên quan đến viết lại kiểu nút chuyển đổi trong cây biểu:

using System; 
using System.Linq.Expressions; 

namespace Bug461 
{ 
    class Program 
    { 
    enum Test { } 

    static void Main() 
    { 
     Expression<Func<Test?, bool>> x = t => t == (Test?)null; 
    } 
    } 
} 

Edit: Tôi chỉnh sửa mã hơi để tránh một cảnh báo.

Chỉnh sửa 2: Lỗi được gây ra bởi https://github.com/dotnet/roslyn/commit/5c602fc6 trong đó toán hạng enum được giảm hạng (nghĩa là chữ rỗng) không có loại liên quan.

Chỉnh sửa 3: Tôi đã thực hiện yêu cầu kéo với đề xuất sửa lỗi: https://github.com/dotnet/roslyn/pull/7227

+0

Tại [tryroslyn.azurewebsites.net] (http://tryroslyn.azurewebsites.net/) bản dịch này. Có một cảnh báo hợp lệ trong đó bạn so sánh một 't' không có giá trị null với' null'. Trong mã của câu hỏi, cả hai mặt của toán tử '==' đều đã có giá trị rỗng (không có gói). –

+1

Có, nhưng nó vẫn treo khi tôi biên dịch nó cục bộ trong Visual Studio, mặc dù chỉ với bản cập nhật VS 2015 1 được cài đặt. –

+0

@SuneFoldager: Vì bạn đã phát ra mã không hợp lệ: D Xem các lỗi kiểm tra trong PR của bạn. PS: Bạn cũng nên thêm các bài kiểm tra với PR của mình. – leppie

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