改善了過載解析度

以下程式碼段顯示了在期望委託時傳遞方法組(而不是 lambda)的示例。由於 C#6 能夠檢查傳遞的方法的返回型別,因此過載解析現在將解決此問題,而不是引發模糊的過載錯誤。

using System;
public class Program
{
    public static void Main()
    {
        Overloaded(DoSomething);
    }

    static void Overloaded(Action action)
    {
       Console.WriteLine("overload with action called");
    }

    static void Overloaded(Func<int> function)
    {
       Console.WriteLine("overload with Func<int> called");
    }

    static int DoSomething()
    {
        Console.WriteLine(0);
        return 0;
    }
}

結果:

Version = 6

輸出

呼叫 Func <int>過載

檢視演示

Version = 5

錯誤

錯誤 CS0121:以下方法或屬性之間的呼叫不明確:’Program.Overloaded(System.Action)‘和’Program.Overloaded(System.Func)

C#6 還可以很好地處理下面的 lambda 表示式的精確匹配情況,這會導致 C#5 出錯。

using System;

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

    static void Main()
    {
        Foo(() => () => 7);
    }
}