更新:如果您可以重现此内容并且/或者希望看到此问题已修复,我已将此作为an issue on 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专业版。
答案 0 :(得分:8)
有趣。我认为你在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编译器都有同样的错误。
现在通过电子邮件发送Eric和Mads ......
编辑:请注意,您可以使用显式参数列表解决此问题。例如,在我的示例代码中,这将起作用:
Produce<string> produce =
(Bar<string> next) => input => next(input, "This string should appear.");
答案 1 :(得分:1)
我通过重命名来解决这个问题 C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.CSharp.targets(不要删除它!) 这是输出窗口中的警告。新项目现在很好,但前一个项目无法加载。之后,我再次将文件重命名为原始名称。现在可以编译这两个项目而不会出错。这是一个经验解决方案,但我希望它有所帮助