[英]Method params match signature, but still getting error
我正在将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 (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
但是,在VS10的C#文件中,此调用下出现红色花体,出现以下错误:
[the method]的最佳重载方法匹配具有一些无效的参数
这是VB中的工作代码。 我究竟做错了什么?
您需要将第二个参数作为ref
传递。
但是,您不能this
作为ref
传递( 除非它是struct ),因此您将需要一个临时变量。
请注意,几乎绝对不会首先ref
该参数。
根据文档 ,VB中用于引用类型的ByRef
与C#中的ref
。 而是意味着函数可以更改变量。
因此,只需从函数定义中删除ref
:
private static void FillOrder(DataRowView row, Order o)
顺便说一句,您的Order
是class
还是struct
?
据我所知,关于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)
反映更新的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.