Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法参数与签名匹配,但仍存在错误_C#_Asp.net_Parameter Passing_Method Signature - Fatal编程技术网

C# 方法参数与签名匹配,但仍存在错误

C# 方法参数与签名匹配,但仍存在错误,c#,asp.net,parameter-passing,method-signature,C#,Asp.net,Parameter Passing,Method Signature,我正在将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

我正在将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中,我在这个调用下得到一个红色的波形,错误如下:

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


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

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

请注意,首先,参数几乎肯定不应该是
ref

根据VB中引用类型的
ByRef
与C#中的
ref
不同。这意味着函数可能会改变变量

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

private static void FillOrder(DataRowView row, Order o)

顺便说一句,您的
顺序是
类还是
结构?

据我所知,关于
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)
的第二次调用反映了更新的引用。

我想知道它是如何工作的:
this
应该是只读的,对吗?因此,您不应该让
ref this
。在C中,您不需要为
Order
参数添加
ref
关键字。这是一个引用类型,您可能不需要通过ref传递它。@Oded:什么?
ref
ByRef
之间没有区别。除非你能给出一个很好的解释,否则你不应该首先使用
ref
参数。@通过使用
ref
参数来解决什么问题?但是翻译中真的需要
ref
吗?@Vlad:不适用于结构@对于参数,是的。关于争论,不,谢谢你的帮助。我需要ref参数,但我重载了该方法,使其与我的方法相同,而另一个方法没有
ref
@Jason:为什么您认为需要
ref
参数?
Order
是一个类。我需要
ref
调用,因此我重载了
FillOrder()
,并使一切正常工作。谢谢你的帮助!错
ByRef
ref
是一样的。@Jason:为什么需要
ref
?是否替换函数内部的
o
?@SLaks:proof?(如果它们真的是相同的,就不能像
ByRef
那样传递
this
)@Vlad:VB在必要时降级为按值传递。