【问题标题】:Convert c# code with inline delegate to vb.net将带有内联委托的 c# 代码转换为 vb.net
【发布时间】:2019-03-23 16:03:56
【问题描述】:

我需要将此代码转换为 vb.net

public IDisposable WriteLock()
{
    EnterWriteLock();
    return new LockDisposer(delegate() { ExitWriteLock(); });
}

这是我通过在线转换器得到的

Public Function WriteLock() As IDisposable
    EnterWriteLock()
    Return New LockDisposer(Sub() ExitWriteLock()) <-- Error Line
End Function

我正在使用 .net 2.0

【问题讨论】:

  • 您说您正在使用.Net 2.0,这是否意味着您要针对它或编译它?对于 vb.net lambda 表达式,您至少需要 3.5 编译器。
  • 我正在使用 v2008 并以 .net2 为目标,原因是我有一个大型解决方案并且升级到 .net 4 会占用我很多时间,尤其是有超过 50 个报告,这也需要转换器
  • “VB.NET(Sub 关键字)中的动作 lambda 已添加到 Visual Studio 2010 附带的 VB 10 中。多行 lambda 也是如此,由方式。” 根据this answer by Heinzi 到 SO 问题Lamba expression cannot be used as expected
  • 可能LockDisposer 构造函数有一个Action 类型的参数。 Sub() ExitWriteLock()LockDisposer 的构造函数的输入参数。查看 C# 委托,它调用 ExitWriteLock(); 而没有 return 语句。
  • 假设LockDisposer的构造函数签名是Public Sub New(exitLock As Action)

标签: c# vb.net delegates


【解决方案1】:
Public Function WriteLock() As IDisposable
     EnterWriteLock()
     Return New LockDisposer(AddressOf ExitWriteLock)
End Function

【讨论】:

    【解决方案2】:

    您的代码缺少委托的结束子:

    Public Function WriteLock() As IDisposable
        Return New LockDisposer(Sub()
                                    ExitWriteLock()
                                End Sub) 
    End Function
    

    Live Demo

    【讨论】:

    • 我试过了,还是不行? SubEnd Sub 被标记为无效表达式
    • 我添加了一个现场演示来回答,请看一下。
    • 谢谢,但请注意,我使用的是 .net 2.0,它在问题中
    • End Sub 仅对多行Lambda Expressions (Visual Basic) 是必需的。
    • 是的,但由于 OP 使用了单石灰 lambda,因此缺少 End Sub 不会导致问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多