Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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#_Vb.net - Fatal编程技术网

C# 可选功能参数,默认值参照

C# 可选功能参数,默认值参照,c#,vb.net,C#,Vb.net,通过将VB.NET编写的代码自动转换为C#我在VB.NET的函数声明中有这样的情况: Private Function dataArchiver(ByVal toPlace As String, Optional ByVal aExtension As String = ".7z", Optional ByRef createdName As String = "")

通过将VB.NET编写的代码自动转换为C#我在VB.NET的函数声明中有这样的情况:

Private Function dataArchiver(ByVal toPlace As String, 
                               Optional ByVal aExtension As String = ".7z", 
                               Optional ByRef createdName As String = "") As Integer
用于自动转换的工具在C#中执行此操作:

这当然行不通。最后一个参数前的关键字“ref”用红色下划线。 为什么会这样?因为字符串createdName可能(不必)在函数中生成,在这种情况下必须从函数中传递出去。 这段代码可以与NETFramework3.5一起使用,这一点很重要


有没有办法在不太熟悉VB.NET程序的情况下在C#中实现此功能?

在这种情况下,您可以使用
out
关键字:

string createdName;
int retVal = dataArchiver("to place", out createdName, extension);
还有你的新方法签名

private int dataArchiver(string toPlace, 
                      out string createdName,
                      string aExtension = ".7z")
{
    createdName = "some value";

    // rest of your code
}

唯一的变化是,
out
不能有方法签名默认值,因此您需要在方法内部设置它。

您必须为此创建重载方法(在C#获取可选参数功能之前,您必须这样做):


我认为C不支持
ref
params的默认值。他们毕竟是不同的语言。解决方案是什么?假设一个
null
值,或者创建一个传递空字符串的
dataArchiver
重载。是的,谢谢,不是很优雅,但重载似乎可以解决。以后使用另一个工具-转换为[ref string createdName=”“]是一个糟糕的转换(因为它无法编译)。您确定原始VB.NET代码实际上需要字符串为
ByRef
?方法或它调用的东西是否实际更改了对字符串的引用?因此,如果调用方将
myCreatedName
作为该参数传递,调用
dataArchiver
myCreatedName
是否会有所不同?是的,可以更改dataArchiver内部的createdName,并且在离开此函数后,程序应该知道它是否已更改或更精确地创建(不是空的).我不确定这是否能满足所有需求,我无法测试,因为自动转换仍然会产生很多问题。你知道VisualBasicNet中关键字“out”的哪一个等价物吗?在VB中没有可比性的东西,但由于
ByRef
在VB中的工作方式,它似乎可以互换。是的,我已经按照“ByteBlast”的建议进行了测试,这可能会起作用,谢谢。但是,通过这个解决方案,我们遇到了一个问题,即使用任何最常用的工具都无法自动翻译具体的代码和平?@user973238:尝试一些,你会发现有些翻译正确,有些则不正确。
private int dataArchiver(string toPlace, 
                      out string createdName,
                      string aExtension = ".7z")
{
    createdName = "some value";

    // rest of your code
}
private int dataArchiver(string toPlace, string aExtension)
{
    string tempVar = "";
    return dataArchiver(toPlace, aExtension, ref tempVar);
}

private int dataArchiver(string toPlace)
{
    string tempVar = "";
    return dataArchiver(toPlace, ".7z", ref tempVar);
}

private int dataArchiver(string toPlace, string aExtension, ref string createdName)
{
    return 0;
}