2016-01-31 16 views
16

Trong số tất cả các tính năng mới trong C# 6, tính năng bí ẩn nhất (đối với tôi) là độ phân giải quá tải được cải thiện ".Độ phân giải quá tải được cải thiện của C# 6 - làm rõ?

Có thể vì tôi couldn't find thông tin/ví dụ/giải thích liên quan về nó.

duy nhất hai tính năng còn lại không được thảo luận là hỗ trợ cho việc xác định một tùy chỉnh Thêm phương pháp khuyến nông để giúp đỡ với initializers bộ sưu tập, một số nhỏ nhưng cải thiện tình trạng quá tải độ phân giải

Nhìn vào roslyn wiki

Có một số cải tiến nhỏ đối với độ phân giải quá tải, trong đó w có khả năng sẽ dẫn đến nhiều điều hơn khi bạn làm việc theo cách bạn mong đợi chúng. Những cải tiến liên quan đến “sự tốt đẹp” - cách trình biên dịch quyết định xem hai sự quá tải nào tốt hơn cho một đối số nhất định.

Và vì vậy tôi hỏi:

Câu hỏi:

Làm thế nào chính xác làm cải thiện độ phân giải quá tải đi vào chơi trong C# 6? Và cách nó khác với C# 5 (Tài liệu Ví dụ?)

+0

http://bc-programming.com/blogs/2015/ 06/c-6-features-improve-overload-resolution/ –

+0

@HansPassant Cảm ơn bạn Hans. Tuy nhiên, trạng thái liên kết _ "Trong Visual Studio 2015, mã này không biên dịch được".Nhưng nó biên dịch và chạy –

+2

@RoyiNamir: Tôi nghi ngờ nó nên có nói "Trong Visual Studio 2013, mã này không biên dịch" - VS 2015 là phiên bản sử dụng C# 6, sau khi tất cả. Xem thêm: https://github.com/dotnet/roslyn/blob/master/docs/specs/CSharp%206/Better%20Betterness.md –

Trả lời

18

Tôi tin rằng những gì là có nghĩa là đây là "betterness tốt hơn" quy tắc đó là documented in the Roslyn github repo.

đang

mẫu:

using System; 

class Test 
{ 
    static void Foo(Action action) {} 
    static void Foo(Func<int> func) {} 
    static int Bar() { return 1; } 

    static void Main() 
    { 
     Foo(Bar);   
    } 
} 

Sử dụng C# 5 trình biên dịch (ví dụ trong c:\Windows\Microsoft.NET\Framework\v4.0.30319\) này mang lại cho hai lỗi:

Test.cs (11,9): lỗi CS0121: Cuộc gọi là nhập nhằng giữa các phương thức hoặc thuộc tính sau:
          'Test.Foo (System.Action)' và 'Test.Foo (System.Func)'
Test.cs (11,13): lỗi CS0407: 'int Test.Bar()' có kiểu trả về sai

Sử dụng trình biên dịch C# 6, nó biên dịch tốt.

Tương tự sử dụng kết hợp chính xác cho các biểu thức lambda, điều này tạo ra một lỗi quá tải nhập nhằng với trình biên dịch C# 5, nhưng không phải cho C# 6:

using System; 

class Test 
{ 
    static void Foo(Func<Func<long>> func) {} 
    static void Foo(Func<Func<int>> func) {} 

    static void Main() 
    { 
     Foo(() =>() => 7); 
    } 
} 
Các vấn đề liên quan