我将我的应用程序从框架版本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();
}
答案 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的参数和返回类型必须与委托匹配。