0

VB ライブラリを C# に変換中です。私のメソッドの 1 つは、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

ただし、C# ファイルの VS10 では、この呼び出しの下に赤い波線が表示され、次のエラーが表示されます。

[メソッド] に最適なオーバーロードされたメソッドに無効な引数が含まれています

これはVBで動作するコードでした。私は何を間違っていますか?

4

3 に答える 3

5

2 番目のパラメーターを として渡す必要がありますref。ただし、 as ( struct でない限り
) を渡すことはできないため、一時変数が必要になります。thisref

refパラメータが最初の場所にあることはほぼ間違いないことに注意してください。

于 2010-12-22T20:40:54.007 に答える
2

ドキュメントによると、 VB の参照型はC#ByRefと同じではありません。refむしろ、関数が変数を変更する可能性があることを意味します。

したがって、ref関数定義からドロップするだけです。

private static void FillOrder(DataRowView row, Order o)

ところで、あなたOrderは aclassまたは astructですか?

于 2010-12-22T20:46:25.937 に答える
1

私が覚えている限り、パラメータについては常に混乱が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

はい、Personcalledのインスタンスはvalueによってme渡されます; これは、インスタンスへの参照が値によって渡されることを意味します。関数は引き続きその参照のメンバーを変更できます。今、これを試してください: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には影響しません。ただし、それを呼び出したメソッドでそのパラメーターの値を変更できるため、2番目の呼び出しが更新された参照を反映するのはなぜですか。PersonmeAssignByReferenceConsole.WriteLine(me.LastName)

于 2010-12-22T20:57:45.043 に答える