2012-08-31 25 views
1

我从降级的框架的版本4我的应用程序第4版,现在我想实现这个VB.NET lambda函数语句(在3.5作品)重写VB.NET Lambda表达式为C#声明

Dim colLambda As ColumnItemValueAccessor = Function(rowItem As Object) General_ItemValueAccessor(rowItem, colName) 

并用C#重写它。这是我的尝试:

ColumnItemValueAccessor colLambda = (object rowItem) => General_ItemValueAccessor(rowItem, colName); 

当我这样做,我得到以下错误:

Error 14 One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll? C:\Source\DotNet\SqlSmoke\SqlSmoke\UserControls\ScriptUserControl.cs 84 73 SqlSmoke 

然而,当我降级从框架4.0版本的应用程序,以3.5(因为我们的用户只hae 3.5并且没有权限安装4.0)。当我这样做时,对“Microsoft.CSharp”的引用已被打破。

我可以使用C#3.5中有效的语法在C#中重写VB.NET命令吗?就像我能够在VB.NET中一样?语法是什么?

我在想,如果我想保持3.5,这是必须的,那么我必须在VB.NET中编写这段代码,因为它看起来像C#在VB之后获得了这种功能。

namespace BinaryComponents.SuperList 
{ 
    public delegate object ColumnItemValueAccessor(object rowItem); 
} 

private object General_ItemValueAccessor(DataRow rowItem, object colName) 
{ 
    DataRow rowPerson = (DataRow)rowItem; 
    return rowPerson[colName.ToString()].ToString(); 
} 
+0

您能告诉我们如何定义** ColumnItemValueAccessor **和** General_ItemValueAccessor **吗? – McGarnagle

+0

当然。请参阅我的更新。谢谢。 – ChadD

回答

1

C#中的动态类型是.NET 4.0的新增功能。

请勿使用动态。

+0

你能解释一下吗?我对这个功能有点新鲜。也许,改变行的语法? – ChadD

+1

也许你正在程序中使用“动态”关键字。 – Dima

+0

我使用了一个代码转换器,并没有意识到“string colName = DataCol.ColumnName;”之前定义为“动态colName = DataCol.ColumnName ;.”我认为我发布的声明是使用“动态打字”。直到你提到动态是一个关键词,我才搜索它并且 - 宾果。谢谢。 – ChadD

0

只要确保在使用

using System.Linq; 
+0

总是包括在内。 – ChadD

0

这个问题似乎是该类型中的一种不匹配的权利。委托参数类型更改从objectDataRow

public delegate object ColumnItemValueAccessor(DataRow rowItem); 

由于AVD注意,您还需要修复的lambda表达式(objectrowItem是隐含的,它不应该有指定的类型)的语法:

ColumnItemValueAccessor colLambda = (rowItem) => General_ItemValueAccessor(rowItem, colName); 

关键的一点是,当你写的委托类型ColumnItemValueAccessor,参数和返回值类型的拉姆达的必须委托匹配lambda表达式。