您好我正在尝试将一些代码从C#转换为VB但由于我缺乏对C#(或者VB)的了解,我遇到了一些问题。我希望有更多技能的人可以帮我。
我在这里使用转换工具: http://www.developerfusion.com/tools/convert/csharp-to-vb/ 转换这里找到的一些代码: http://www.urmanet.ch/?p=11
该代码旨在制作EF实体的深层副本。
纠正&&在第87行,转换完成正常。稍后进行了一些导入并修复了一些简单的错误,我无法解决的其余错误如下:
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)})
在'''后面有一个波浪形,表示预期类型,我不知道该怎么做这条线,因此如何解决它,是否有人能够澄清一点?
4:该行
Private Shared ReadOnly _tracking As New List()
通知我System.Collections.Generic.List(Of T)的类型参数太少。这是因为C#和VB之间存在一些差异吗?
非常感谢任何建议。
答案 0 :(得分:5)
转到here,了解扩展方法在VB中的工作原理。如果有很多这些手动转换它们可能会很繁琐。也许你应该考虑将它们留在C#中,因为代码编译成相同的中间语言。
var
表示编译器推断出类型。
在C#中你可以说`new [] {1,2,3},编译器会根据元素推断出你的数组类型,但我不知道这是否适用于VB
您必须将类型放在括号中以创建正确的泛型类型。像New List(string)
答案 1 :(得分:3)
如果您发布原始C#代码,而不仅仅是您尝试转换失败,那么这样的问题远更容易回答。就像现在一样,我们只能猜测代码应该做什么,而不是自己进行转换。
但无论如何我都会猜测......
据推测,有问题的代码实际上是在C#中的static
类中声明的。出于兼容性原因,这些在VB.NET中称为“模块”。他们的工作方式完全相同;相信编译器的建议并将扩展方法移到模块中。
声明变量as var
是您在C#中执行anonymous typing的方法。 VB.NET中的等价物是在项目的属性中打开Option Infer
。您将需要删除as var
声明,然后编译器将自动推断变量的类型,就像在C#中一样。
我不知道这行代码的目的是什么,因为您没有在C#中显示原始工作代码,但您需要删除New
并更改声明数组的方式:
Dim t = GetType(EntityCollection(Of )).MakeGenericType([property].PropertyType.GetGenericArguments()(0))
不,这不是由于VB.NET和C#之间的差异造成的。这是因为您使用了通用List(Of T)
类,但未能指定要使用的类型。例如,您的代码应如下所示:
Private Shared ReadOnly _tracking As New List(Of Integer)
答案 2 :(得分:1)
对于#3,MakeGenericType
方法需要一个Type
的可变数组。您可以使用Dim t = GetType(EntityCollection(Of )).MakeGenericType([property].PropertyType.GetGenericArguments()(0))
对于#4,我无法想象如何在C#中编译。但是,查看完整的源代码似乎Private Shared ReadOnly _tracking As New List(Of SelfReferencesTracking)
是正确的。