C# 方法参数与签名匹配,但仍存在错误
我正在将VB库转换为C#。我的一个方法在VB中具有以下签名:C# 方法参数与签名匹配,但仍存在错误,c#,asp.net,parameter-passing,method-signature,C#,Asp.net,Parameter Passing,Method Signature,我正在将VB库转换为C#。我的一个方法在VB中具有以下签名: Private Shared Sub FillOrder(ByVal row As DataRowView, ByRef o As Order) 在C#中,我将其转换为: private static void FillOrder(DataRowView row, ref Order o) 从我的Order类中的构造函数调用FillOrder()方法,如下所示: DataView dv = //[get the data] if
Private Shared Sub FillOrder(ByVal row As DataRowView, ByRef o As Order)
在C#中,我将其转换为:
private static void FillOrder(DataRowView row, ref Order o)
从我的Order
类中的构造函数调用FillOrder()
方法,如下所示:
DataView dv = //[get the data]
if (dv.Count > 0)
{
FillOrder(dv[0], this);
}
在VB中,这项工作:
Dim dv As DataView = '[get data]'
If dv.Count > 0 Then
FillOrder(dv.Item(0), Me)
End If
但是,在C#文件的VS10中,我在这个调用下得到一个红色的波形,错误如下:
[方法]的最佳重载方法匹配具有一些无效参数
这是VB中的工作代码。我做错了什么?您需要将第二个参数作为
ref
传递但是,不能将
此
作为ref
()传递,因此需要一个临时变量
请注意,首先,参数几乎肯定不应该是ref
。根据VB中引用类型的ByRef
与C#中的ref
不同。这意味着函数可能会改变变量
因此,只需从函数定义中删除ref
:
private static void FillOrder(DataRowView row, Order o)
顺便说一句,您的
顺序是类还是结构?据我所知,关于ByVal
和ByRef
/ref
参数一直存在混淆。以下是我能解释的最好方式:
仅当且仅当您计划用不同的引用替换该引用时,才需要通过引用传递对象。如果要更改所传递对象的内容,只需按值传递即可。例如:
Public Class Person
Public Property FirstName As String
Public Property LastName As String
End Class
Public Shared Sub ModifyPerson(ByVal someone As Person)
' Passed by value ^^^^^
someone.LastName = "Doe"
End Sub
Public Shared Sub Main(ByVal args() As String)
Dim me As New Person
me.FirstName = "Adam"
me.LastName = "Maras"
ModifyPerson(me)
Console.WriteLine(me.LastName) ' Writes "Doe"
End Sub
是的,名为me
的Person
实例通过值传递到ModifyPerson
;这仅仅意味着对实例的引用是通过值传递的。函数仍然可以修改该引用的成员。现在,试试这个:
Public Shared Sub Main(ByVal args() As String)
Dim me As New Person
me.FirstName = "Adam"
me.LastName = "Maras"
AssignByValue(me)
Console.WriteLine(me.LastName) ' Writes "Maras"
AssignByReference(me)
Console.WriteLine(me.LastName) ' Writes "Doe"
End Sub
Public Shared Sub AssignByValue(ByVal someone As Person)
Dim new As New Person
new.FirstName = "John"
new.LastName = "Doe"
someone = new
End Sub
Public Shared Sub AssignByReference(ByRef someone As Person)
Dim new As New Person
new.FirstName = "John"
new.LastName = "Doe"
someone = new
End Sub
这些函数的不同之处在于它们试图修改传入的实际引用AssignByValue
对名为me
的Person
没有影响,因为参数是按值传递的。但是,AssignByReference
可以更改调用它的方法中该参数的值,因此为什么对Console.WriteLine(me.LastName)
的第二次调用反映了更新的引用。我想知道它是如何工作的:this
应该是只读的,对吗?因此,您不应该让ref this
。在C中,您不需要为Order
参数添加ref
关键字。这是一个引用类型,您可能不需要通过ref传递它。@Oded:什么?ref
和ByRef
之间没有区别。除非你能给出一个很好的解释,否则你不应该首先使用ref
参数。@通过使用ref
参数来解决什么问题?但是翻译中真的需要ref
吗?@Vlad:不适用于结构@对于参数,是的。关于争论,不,谢谢你的帮助。我需要ref参数,但我重载了该方法,使其与我的方法相同,而另一个方法没有ref
@Jason:为什么您认为需要ref
参数?Order
是一个类。我需要ref
调用,因此我重载了FillOrder()
,并使一切正常工作。谢谢你的帮助!错ByRef
和ref
是一样的。@Jason:为什么需要ref
?是否替换函数内部的o
?@SLaks:proof?(如果它们真的是相同的,就不能像ByRef
那样传递this
)@Vlad:VB在必要时降级为按值传递。