2010-07-18 36 views
6

UPDATE:我已经提交这个作为an issue on Microsoft Connect,如果你能重现这个和/或希望看到这个问题,请帮助在那里投票。如果将委托定义放入另一个项目中,编译失败?


我一直试图解决这个问题几个小时了。
真的很感谢你能想到的任何想法/建议。首先,我有3个文件Class.csDefinitions.csProgram.cs。我粘贴了http://pastie.org/1049492的文件内容供您试用。

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

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

  • 代表Act不采取2个参数。
  • 无法转换lambda表达式的委托类型“DC.Lib.Produce”,因为一些块的返回类型不隐式转换为委托返回类型...

这里是一个完整的解决方案3个项目 - 1个所有文件组合在一起,另一个与定义放在另一个项目中:
http://dl.dropbox.com/u/149124/DummyConsole.zip

我正在使用VS2010 RTW专业版。

回答

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."); 
+0

谢谢!不耐烦地等待更多的反馈...希望我不必回到3.5只为这个TT – chakrit 2010-07-18 18:14:51

+1

@chakrit:我已经提出了一个解决方法,但我不明白回到.NET 3.5会有什么帮助你 - 正如我所说的,我已经看到了与C#3编译器相同的问题。 – 2010-07-18 18:37:46

+0

我正在重写/重构一个在3.5中工作正常的库,以利用新的.NET 4.0的东西....我想我必须在这个过程中绊倒一些电线。 – chakrit 2010-07-18 18:53:54

1

我解决了这个由 Ç重命名:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ Microsoft.CSharp.targets(不删除它!) 这是输出窗口中的警告。新项目现在好了,但以前的项目无法加载。之后,我再次将文件重命名为它的原始名称。现在这两个项目都可以编译而不会出错。这是一个经验丰富的解决方案,但我希望它可以帮助

相关问题