Ответ 1
Я верю, что здесь подразумеваются правила "лучшего бытия", которые задокументированы в репозитории github в Roslyn.
Пример кода:
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);
}
}
Используя компилятор С# 5 (например, в c:\Windows\Microsoft.NET\Framework\v4.0.30319\
), это дает две ошибки:
Test.cs(11,9): ошибка CS0121: вызов неоднозначен между следующими способами или свойствами:
'Test.Foo(System.Action)' и 'Test.Foo(System.Func)'
Test.cs(11,13): ошибка CS0407: 'int Test.Bar()' имеет неправильный тип возврата
Используя компилятор С# 6, он компилируется отлично.
Аналогично, используя точное сопоставление для лямбда-выражений, это порождает неоднозначную ошибку перегрузки с помощью компилятора С# 5, но не для С# 6:
using System;
class Test
{
static void Foo(Func<Func<long>> func) {}
static void Foo(Func<Func<int>> func) {}
static void Main()
{
Foo(() => () => 7);
}
}