Благодаря автоматическому преобразованию кода, написанного на VB.NET, в С# у меня такая ситуация в объявлении функции VB.NET:
Private Function dataArchiver(ByVal toPlace As String,
Optional ByVal aExtension As String = ".7z",
Optional ByRef createdName As String = "") As Integer
Инструмент для автоматического преобразования делает это в С#:
private int dataArchiver(string toPlace,
string aExtension = ".7z",
ref string createdName = "")
И это, конечно, не работает. Ключевое слово "ref" перед последним аргументом подчеркивается красным. Почему это так? Поскольку string createdName может быть (и не обязательно) сгенерирован в функции, и в этом случае нужно отказаться от функции. Важно, чтобы этот код мог работать с NET framework 3.5.
Любая идея заставить это работать на С# без переосмысления программы VB.NET?
Для этого вам необходимо создать перегруженные методы (как вам пришлось бы сделать, прежде чем С# приобретет необязательную функцию параметра):
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;
}
Вместо этого вы можете использовать ключевое слово 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
что у out
не может быть значения по умолчанию для сигнатуры метода, поэтому вам нужно будет установить его внутри метода.
ByRef
работает в VB, оно кажется довольно взаимозаменяемым. stackoverflow.com/a/4358774/1561465
ref
параметров. В конце концов, это разные языки. Решение? Примитеnull
значение или создайте перегрузкуdataArchiver
которая передает пустую строку.