簡體   English   中英

方法參數匹配簽名,但仍然出現錯誤

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

順便說一句,您的Orderclass還是struct

據我所知,關於ByValByRef / 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

是的, 通過值將名為mePerson實例傳遞給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對名為mePerson無效,因為參數是通過值傳遞的。 但是, AssignByReference可以在調用它的方法中更改該參數的值,因此為什么第二次調用Console.WriteLine(me.LastName)反映更新的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM