Компиляция перестала работать, если определения делегата помещаются в другой проект?

ОБНОВЛЕНИЕ: я зарегистрировал это как проблему о Microsoft Connect, если Вы можете воспроизвести это и/или хотели бы видеть, что это зафиксировало, помогите проголосовать за проблему там.


Я пытался решить эту проблему в течение многих часов теперь.
Действительно ценил бы любую идею/совет, о которой можно думать.

В первую очередь, у меня есть 3 файла Class.cs Definitions.cs и Program.cs. Я вставил содержание файла по http://pastie.org/1049492 для Вас для испытания.

Проблема - это, Если у Вас есть ВСЕ 3 файла в том же проекте консольного приложения. Компиляции приложения и выполнения очень хорошо.

Если однако, я имею Class.cs и Definitions.cs в проекте "библиотеки", к которому ссылаются из основного проекта консольного приложения, который имеет только Program.cs файл, компиляция перестала работать с:

  • Делегат Act не берет 2 аргумента.
  • Не может преобразовать лямбда-выражение для делегирования типа 'DC.Lib. Произведите', потому что некоторые типы возврата в блоке не неявно конвертируемы к типу возврата делегата...

Вот полное решение с 3 проектами - 1 со всеми файлами, объединенными вместе, и другой с определениями вставил другой проект:
http://dl.dropbox.com/u/149124/DummyConsole.zip

Я использую выпуск Профессионала VS2010 RTW.

6
задан chakrit 24 July 2010 в 08:20
поделиться

1 ответ

Интересно. Я думаю , что вы нашли настоящую ошибку в компиляторе 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.");
8
ответ дан 10 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: