繁体   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