将VB.NET Lambda表达式重写为C#语句

时间:2012-08-31 03:34:34

标签: c# vb.net vb.net-to-c#

我将我的应用程序从框架版本4降级到版本4,现在我想实现这个VB.NET lambda函数语句(适用于3.5)

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时(因为我们的用户只有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();
}

3 个答案:

答案 0 :(得分:1)

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

不要使用动态。

答案 1 :(得分:0)

确保使用正确的

using System.Linq;

答案 2 :(得分:0)

问题似乎是其中一种类型不匹配。将委托参数类型从object更改为DataRow

public delegate object ColumnItemValueAccessor(DataRow rowItem);

正如AVD指出的那样,你还需要修复lambda表达式的语法(隐含object的{​​{1}}类型,不应该在那里指定):

rowItem

关键是当你为委托类型ColumnItemValueAccessor colLambda = (rowItem) => General_ItemValueAccessor(rowItem, colName); 编写lambda表达式时,lambda的参数和返回类型必须与委托匹配。