[英]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.