C# Language Resolución mejorada de sobrecarga


Ejemplo

El siguiente fragmento de código muestra un ejemplo de cómo pasar un grupo de métodos (a diferencia de un lambda) cuando se espera un delegado. La resolución de sobrecarga ahora resolverá esto en lugar de generar un error de sobrecarga ambiguo debido a la capacidad de C # 6 para verificar el tipo de retorno del método que se pasó.

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

Resultados:

6.0

Salida

sobrecarga con Func <int> llamada

Ver demostración

5.0

Error

error CS0121: la llamada es ambigua entre los siguientes métodos o propiedades: 'Program.Overloaded (System.Action)' y 'Program.Overloaded (System.Func)'

C # 6 también puede manejar bien el siguiente caso de coincidencia exacta para expresiones lambda que podría haber resultado en un error en 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);
    }
}