【问题标题】:C# to VB conversion issuesC# 到 VB 的转换问题
【发布时间】:2011-02-23 06:31:27
【问题描述】:

您好,我正在尝试将一些代码从 C# 转换为 VB,但由于我缺乏 C#(或者可能是 VB)知识,我遇到了一些问题。我希望有更多技能的人可以纠正我。

我在这里使用转换工具: http://www.developerfusion.com/tools/convert/csharp-to-vb/ 转换这里找到的一些代码: http://www.urmanet.ch/?p=11

该代码旨在制作 EF 实体的深层副本。

更正第87行的&&后,转换完成OK。后来导入了几次,修复了一些简单的错误,剩下的我无法解决的错误如下:

1:线

<System.Runtime.CompilerServices.Extension()> _
    Public Shared Function Clone(entityObject As EntityObject) As EntityObject

被标记为只能在模块中定义扩展方法。它是在一个类中定义的,但我认为这在 C# 中有效,那么为什么在 VB 中会出现此错误?

2:有很多这样的行:

For Each [property] As var In properties

“as var”部分被标记为未定义;我不完全确定“as var”是什么意思,我可以删除它并让编译器推断类型吗?

3:这行代码有错误:

Dim t = GetType(EntityCollection(Of )).MakeGenericType(New () {[property].PropertyType.GetGenericArguments()(0)})

在'New'之后的'('下面有一个波浪线,表示Type Expected,我不知道这条线该怎么做,因此如何修复它,有人能澄清一下吗?

4:行

Private Shared ReadOnly _tracking As New List()

通知我 System.Collections.Generic.List(Of T) 的类型参数太少。这是因为 C# 和 VB 之间的一些差异吗?

非常感谢您的建议。

【问题讨论】:

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


    【解决方案1】:
    1. here 看看扩展方法在 VB 中是如何工作的。如果它们很多,手动转换它们可能很乏味。也许您应该考虑将它们留在 C# 中,因为代码会编译为相同的中间语言。

    2. var 表示编译器推断类型。

    3. 在 C# 中你可以说 `new[] { 1, 2, 3 },编译器会根据元素为你推断数组的类型,但我不知道这在 VB 中是否有效.

    4. 您必须将类型放在括号中才能创建正确的泛型类型。类似New List(string)

    【讨论】:

    • 感谢您的回复。我回来后会提供反馈。
    • 再次感谢您的 cmets,代码现在可以正常编译了。
    【解决方案2】:

    如果您发布原始 C# 代码,而不仅仅是尝试转换失败,这样的问题会更容易回答。就像现在一样,我们只能猜测代码应该做什么,而不是自己进行转换。

    但无论如何我都会尝试猜测......

    1. 据推测,有问题的代码实际上是在 C# 的 static 类中声明的。出于兼容性原因,这些在 VB.NET 中被称为“模块”。它们的工作方式完全相同;相信编译器的建议并将您的扩展方法移动到模块中。

    2. 在 C# 中声明变量 as var 就是 anonymous typing。 VB.NET 中的等效项是在项目的属性中打开Option Infer。您将需要删除 as var 声明,然后编译器将自动推断变量的类型,就像在 C# 中一样。

    3. 我不知道这行代码打算做什么,因为您没有在 C# 中显示原始 工作 代码,但是您需要删除 New 并更改其方式你声明数组:

      Dim t = GetType(EntityCollection(Of )).MakeGenericType([property].PropertyType.GetGenericArguments()(0))
      
    4. 不,这不是由 VB.NET 和 C# 之间的差异引起的。这是因为您使用了通用的List(Of T) 类,但未能指定您要使用的类型。例如,您的代码应如下所示:

      Private Shared ReadOnly _tracking As New List(Of Integer)
      

    【讨论】:

    • 感谢您的回复。我在原始帖子中提供了 C# 源代码的完整链接,这里又是:urmanet.ch/?p=11,它的主要代码块长达 180 行。我必须出去,但我回来后会尽快查看您的建议。
    • 非常感谢这些答案,它们帮助我完全编译了代码。非常感谢。
    【解决方案3】:

    对于#3,MakeGenericType 方法需要一个可变参数数组Type。您可以通过Dim t = GetType(EntityCollection(Of )).MakeGenericType([property].PropertyType.GetGenericArguments()(0)) 完成此操作

    对于#4,我也无法想象它如何在 C# 中编译。但是,查看完整源代码似乎Private Shared ReadOnly _tracking As New List(Of SelfReferencesTracking) 是正确的。

    【讨论】:

    • @TripleAntigen:我找到了原件(我想我得到了你的答案——见我的编辑),但你应该发布有问题的确切行。你不能指望我们筛选数百行代码而不给我们一些提示。
    • 太好了,这两个建议都有很大帮助。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多