C#学习教程:如果将委托定义放在另一个项目中,则编译失败?分享


如果将委托定义放在另一个项目中,则编译失败?

更新:我已经将此作为Microsoft Connect上的问题提交,如果您可以重现这一点和/或希望看到此修复,请帮助在那里投票解决问题。


我一直试图解决这个问题好几个小时了。
非常感谢您能想到的任何想法/建议。

首先,我有3个文件Class.cs Definitions.csProgram.cs 。 我已经在http://pastie.org/1049492粘贴了文件内容供您试用。

问题是,如果在同一控制台应用程序项目中有所有3个文件。 应用程序编译并运行得很好。

但是,如果我在一个“库”项目中有Class.csDefinitions.cs ,它从只有Program.cs文件的主控制台应用程序项目中引用,则编译失败:

这是一个包含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(IData input, T extraInfo); public delegate Foo Produce(Bar next); // Test.cs class Test { static void Main() { Produce 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' 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原因外,该规范很少讨论assembly边界。

有趣的是,我对C#3和4编译器都有同样的错误。

现在通过电子邮件发送Eric和Mads ……

编辑:请注意,您可以使用显式参数列表解决此问题。 例如,在我的示例代码中,这将起作用:

 Produce produce = (Bar next) => input => next(input, "This string should appear."); 

我通过重命名C: Windows Microsoft.NET Framework v4.0.30319 Microsoft.CSharp.targets(不要删除它!)来解决这个问题,这是输出窗口中的警告。 新项目现在很好,但前一个项目无法加载。 之后,我再次将文件重命名为原始名称。 现在可以编译这两个项目而不会出错。 这是一个经验解决方案,但我希望它有所帮助

上述就是C#学习教程:如果将委托定义放在另一个项目中,则编译失败?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1301232.html

(0)
上一篇 2023年1月11日 下午6:16
下一篇 2023年1月11日 下午6:19

精彩推荐