ОБНОВЛЕНИЕ: я зарегистрировал это как проблему о Microsoft Connect, если Вы можете воспроизвести это и/или хотели бы видеть, что это зафиксировало, помогите проголосовать за проблему там.
Я пытался решить эту проблему в течение многих часов теперь.
Действительно ценил бы любую идею/совет, о которой можно думать.
В первую очередь, у меня есть 3 файла Class.cs
Definitions.cs
и Program.cs
. Я вставил содержание файла по http://pastie.org/1049492 для Вас для испытания.
Проблема - это, Если у Вас есть ВСЕ 3 файла в том же проекте консольного приложения. Компиляции приложения и выполнения очень хорошо.
Если однако, я имею Class.cs
и Definitions.cs
в проекте "библиотеки", к которому ссылаются из основного проекта консольного приложения, который имеет только Program.cs
файл, компиляция перестала работать с:
Act
не берет 2 аргумента.Вот полное решение с 3 проектами - 1 со всеми файлами, объединенными вместе, и другой с определениями вставил другой проект:
http://dl.dropbox.com/u/149124/DummyConsole.zip
Я использую выпуск Профессионала VS2010 RTW.
Интересно. Я думаю , что вы нашли настоящую ошибку в компиляторе 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
Я не могу придумать какой-либо причины, почему это должно быть разным для разных сборок, поскольку все является общедоступным. В спецификации редко говорится о границах сборки, кроме как по внутренним
причинам.
Интересно, что я получаю одну и ту же ошибку для компиляторов C # 3 и 4.
Напишите Эрику и Мэдсу по электронной почте ...
РЕДАКТИРОВАТЬ: Обратите внимание, что вы можете обойти это, используя явный список параметров. Например, в моем примере кода это будет работать:
Produce<string> produce =
(Bar<string> next) => input => next(input, "This string should appear.");