1

我将我的应用程序从框架的第 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”的引用被破坏了。

我可以像在 VB.NET 中那样使用在 C# 3.5 中有效的语法在 C# 中重写 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();
}
4

3 回答 3

1

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

不要使用动态。

于 2012-08-31T03:37:44.343 回答
0

只要确保正确使用

using System.Linq;
于 2012-08-31T03:42:24.387 回答
0

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

public delegate object ColumnItemValueAccessor(DataRow rowItem);

正如 AVD 所指出的,您还需要修复 lambda 表达式的语法(隐含objectfor的类型rowItem,不应在此处指定):

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

关键是当你为委托类型编写 lambda 表达式时,lambdaColumnItemValueAccessor的参数和返回类型必须与委托匹配。

于 2012-08-31T04:18:02.833 回答