impworks / lens

Language for Embeddable .NET Scripting
MIT License
91 stars 9 forks source link

Не работает приведение возвращаемого значения лямбды #156

Open impworks opened 10 years ago

impworks commented 10 years ago

При использовании литерала лямбды следует передавать ей тип возвращаемого значения из контекста:

fun test (fx:Func<object>) ->
    println (fx ())

test (-> 1)

При переиспользовании уже созданного делегата, если типы не ковариантны, должно выдаваться сообщение об ошибке.

Кроме того, следует не забыть о случае, когда тип возвращаемого значения является обобщенным аргументом метода:

IEnumerable<T2> Select<T1, T2>(IEnumerable<T1> src, Func<T1, T2> cvt)
impworks commented 10 years ago

Проблема оказалась шире.

Поскольку у выражения (-> 1) нет аргументов с неизвестным типов, его тип - Func<int>, и ресолвер методов вполне обоснованно посчитает функцию test.

Для исправления можно было бы либо считать все лямбда-выражения Lambda<T...> до тех пор, пока они не присвоены куда-либо - однако это сломает возможность использовать методы, переопределенные по возвращаемому значению лямбды, например IEnumerable.Sum(). Так что пока откладываем.