0

我正在将 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

但是,在 C# 文件的 VS10 中,我在此调用下得到一个红色曲线,并出现以下错误:

[the method] 的最佳重载方法匹配有一些无效参数

这是VB中的工作代码。我究竟做错了什么?

4

3 回答 3

5

您需要将第二个参数作为ref.
但是,您不能传递thisas ref(除非它是 struct ),因此您需要一个临时变量。

请注意,该参数几乎绝对不应该ref放在首位。

于 2010-12-22T20:40:54.007 回答
2

根据文档ByRefVB 中的引用类型与refC# 中的不同。这意味着该函数可能会更改变量。

ref因此,只需从函数定义中删除:

private static void FillOrder(DataRowView row, Order o)

顺便说一句,你Order是 aclass还是 a struct

于 2010-12-22T20:46:25.937 回答
1

ByVal从我记事起,关于and 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

Person是的,被调用的实例是按值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

这些函数不同,因为它们试图修改传入的实际引用。AssignByValuePerson命名没有影响,me因为参数是按值传递的。但是,AssignByReference可以在调用它的方法中更改该参数的值,因此为什么第二次调用Console.WriteLine(me.LastName)反映了更新的引用。

于 2010-12-22T20:57:45.043 回答