Вывод типа лямбды и dynamic
От: SergASh  
Дата: 19.06.19 07:20
Оценка:
Привет всем!

Вот небольшой примерчик.
Первый, многословный вариант компилируется.

А второй нет, компилятор считает что, target.OnLog( logEntry ) возвращает dynamic.
Как так?

public interface ILogNotifications
{
  Task OnLog( dynamic logEntry );
}
public class LogNotificationsMultiplexer : ILogNotifications
{
  public Task OnLog( dynamic logEntry )
  {
    // так работает
    var result1 = Task.WhenAll( targets_.Select( (Func<ILogNotifications, Task>)( target => target.OnLog( logEntry ) ) ) );

    // а так нет
    var result2 = Task.WhenAll( targets_.Select( target => target.OnLog( logEntry ) ) );

    return result1;
  }
 
  private readonly ConcurrentBag<ILogNotifications> targets_ = new ConcurrentBag<ILogNotifications>();
}
Re: Вывод типа лямбды и dynamic
От: vorona  
Дата: 19.06.19 11:13
Оценка:
Здравствуйте, SergASh, Вы писали:

result2 = Task.WhenAll(targets_.Select(target => target.OnLog((object)logEntry)));

или
static class EnumerableExtension
{
    public static IEnumerable<Task> Select2<TSource>(this IEnumerable<TSource> source, Func<TSource, Task> selector)
    {
        foreach (TSource item in source)
            yield return selector(item);
    }
}
Re[2]: Вывод типа лямбды и dynamic
От: SergASh  
Дата: 20.06.19 07:06
Оценка:
Здравствуйте, vorona, Вы писали:

Ну так вопрос почему это происходит, а не как выкрутиться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.