Jas*_*son 3 c# vb.net asp.net lambda
我有一些代码,我的任务是从VB转换为C#.我的一个片段似乎无法从一个转换为另一个,如果是这样,我只是不知道该怎么做而且有点沮丧.
这是一些背景知识:
OrderForm是一个abstract类,由Invoice(也PurchaseOrder)继承.以下VB代码段正常工作:
Dim Invs As List(Of OrderForm) = GetForms(theOrder.OrderID)
....
Dim inv As Invoice = Invs.Find(
Function(someInv As Invoice) thePO.SubPONumber = someInv.SubInvoiceNumber)
Run Code Online (Sandbox Code Playgroud)
在C#中,我最好转换它是:
List<OrderForm> Invs = GetForms(theOrder.OrderID);
....
Invoice inv = Invs.Find(
(Invoice someInv) => thePO.SubPONumber == someInv.SubInvoiceNumber);
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我收到以下错误:
无法将lambda表达式转换为委托类型"System.Predicate",因为参数类型与委托参数类型不匹配
有没有办法解决这个问题而不重构我的整个代码库?
每当您将VB转换为C#时,始终打开选项STRICT ON.在这种情况下,您甚至可以在点击c#之前看到错误消息.在这种情况下,VB将返回
Option Strict On不允许缩小lambda表达式和委托'System.Predicate(Of OrderForm)'之间的隐式类型转换
从那里你可以很容易地看到你试图隐式地将基类强制转换为子类.人们在这里写的C#代码是正确的,这是VB的等价物:
Dim inv As Invoice = DirectCast(Invs.Find(Function(someInv As OrderForm) SubPONumber = DirectCast(thePO.SubPONumber, Invoice).SubInvoiceNumber), Invoice)
Run Code Online (Sandbox Code Playgroud)
UPDATE
这是@Anthony Pegram的帖子中的C#版本:
Invoice inv = (Invoice)Invs.Find(someInv => thePO.SubPONumber == ((Invoice)someInv).SubInvoiceNumber);
Run Code Online (Sandbox Code Playgroud)
另外,如果可能,我建议您对模式进行一些更改.GetForms()现在回来,OrderForms但后来你只是假设他们都是Invoices.希望你有一些逻辑来验证.我建议否则GetForms()实际返回Invoices.
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |