Интересно.Я думаю вы обнаружили реальную ошибку в компиляторе C # - хотя я могу упустить что-то неуловимое.Я написал несколько упрощенную версию, в которой исключены возможности перегрузки и т. Д. И которая обходится без дополнительного метода:
// Definitions.cs
public interface IData { }
public delegate IData Foo(IData input);
public delegate IData Bar<T>(IData input, T extraInfo);
public delegate Foo Produce<T>(Bar<T> next);
// Test.cs
class Test
{
static void Main()
{
Produce<string> produce =
next => input => next(input, "This string should appear.");
}
}
Демонстрация компиляции как одной сборки без ошибок:
> csc Test.cs Definitions.cs
Демонстрация компиляции в виде двух сборок с ошибками:
> csc /target:library Definitions.cs
> csc Test.cs /r:Definitions.dll
Test.cs(5,43): error CS1662: Cannot convert lambda expression
to delegate type 'Produce<string>'
because some of the return types in the block are not
implicitly convertible to the delegate return type
Test.cs(5,52): error CS1593: Delegate 'Bar' does not take 2 arguments
Я не могу придумать любую причину, по которой это должно отличаться в разных сборках, поскольку все общедоступно.Спецификация редко говорит о границах сборки, кроме как по internal
причинам.
Интересно, что я получаю одинаковую ошибку как для компиляторов C # 3, так и для 4.
Отправляя электронное письмо Эрику и Мэдсу сейчас ...
РЕДАКТИРОВАТЬ: Обратите внимание, что вы можете обойти это, используя явный список параметров.Например, в моем примере кода это будет работать:
Produce<string> produce =
(Bar<string> next) => input => next(input, "This string should appear.");