C# Language Migliore risoluzione del sovraccarico

Esempio

Lo snippet seguente mostra un esempio di passaggio di un gruppo di metodi (al contrario di un lambda) quando è previsto un delegato. Risoluzione di sovraccarico ora risolverà questo invece di sollevare un ambiguo errore di sovraccarico dovuto alla capacità di C # 6 di controllare il tipo di ritorno del metodo che è stato passato.

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;
    }
}

risultati:

6.0

Produzione

sovraccarico con Func <int> chiamato

Visualizza la demo

5.0

Errore

errore CS0121: la chiamata è ambigua tra i seguenti metodi o proprietà: "Program.Overloaded (System.Action)" e "Program.Overloaded (System.Func)"

C # 6 può anche gestire bene il seguente caso di corrispondenza esatta per espressioni lambda che avrebbe comportato un errore in 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);
    }
}