[StackOverflow, C# 5] break; vs method resolution
От: Sinix  
Дата: 24.09.14 06:09
Оценка: 15 (1)
В принципе, несложно, но на форуме затишье, так что и такое сойдёт

Итак,
1

    class Program
    {
        static void Main(string[] args)
        {
            Observable.Create<string>(async blah =>
            {
                while (true)
                {
                    Console.WriteLine("foo.");
                    break; //Remove this and the compiler will break
                }
            });
        }
    }

    public class Observable
    {
        public static IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, Task> subscribeAsync)
        {
            throw new Exception("Method1.");
        }

        public static IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, Task<Action>> subscribeAsync)
        {
            throw new Exception("Method2.");
        }
    }

    public interface IObserver<T>
    {
    }


2. Убираем "break;" — получаем ошибку компиляции
The call is ambiguous between the following methods or properties: 
'ConsoleApplication1.Observable.Create<string>(System.Func<ConsoleApplication1.IObserver<string>,System.Threading.Tasks.Task>)'
 and 
'ConsoleApplication1.Observable.Create<string>(System.Func<ConsoleApplication1.IObserver<string>,System.Threading.Tasks.Task<System.Action>>)'


3. Объяснение — по ссылке, но и самому догадаться несложно.

4. Чтоб было веселее:

4.1 — заменить break на любую инструкцию так, чтобы код компилировался, но бросалось исключение с текстом "Method2".
4.2 — изменить только сигнатуру Create так, чтобы с break вызывался вариант "Method1", без — "Method2".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.