Необязательный параметр функции со значением по умолчанию по ссылке

1

Благодаря автоматическому преобразованию кода, написанного на 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?

  • 2
    Я не думаю, что C # поддерживает значения по умолчанию для ref параметров. В конце концов, это разные языки. Решение? Примите null значение или создайте перегрузку dataArchiver которая передает пустую строку.
  • 0
    Да, спасибо, не так элегантно, но кажется, что с перегрузкой это можно решить.
Показать ещё 3 комментария
Теги:

2 ответа

1
Лучший ответ

Для этого вам необходимо создать перегруженные методы (как вам пришлось бы сделать, прежде чем С# приобретет необязательную функцию параметра):

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;
}
  • 0
    Да, я проверяю, что уже как 'ByteBlast' предполагает, что это может сработать, спасибо.
  • 0
    Но также, с этим решением здесь мы сталкиваемся с проблемой, что конкретный код не может быть переведен автоматически с помощью любого из наиболее используемых инструментов?
Показать ещё 1 комментарий
1

Вместо этого вы можете использовать ключевое слово 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 не может быть значения по умолчанию для сигнатуры метода, поэтому вам нужно будет установить его внутри метода.

  • 0
    Я не уверен, что это удовлетворит все потребности, и я не могу проверить это, так как здесь все еще много проблем, возникающих при автоматическом преобразовании. Возможно, вы знаете, какой эквивалент для ключевого слова "out" в Visual Basic NET?
  • 0
    В VB нет ничего сопоставимого, но из-за того, как ByRef работает в VB, оно кажется довольно взаимозаменяемым. stackoverflow.com/a/4358774/1561465

Ещё вопросы

Сообщество Overcoder
Наверх
Меню