Параметры по умолчанию побеждены ключевым словом out - PullRequest
0 голосов
/ 21 января 2011

Я написал общий метод enum TryParse, который я хотел бы использовать с необязательными параметрами, но поскольку он содержит ключевое слово out, оказывается, что это невозможно.

Здесьпример кода:

public static class Enum<T>
{
  public static bool TryParse(string value, bool ignoreCase = true, out T returnedValue)
  {
    //Not really relevant to the question, but here for completeness.
    try
    {
      returnedValue = (T)Enum.Parse(typeof(T), value, ignoreCase);
      return true;
    }
    catch
    {
      returnedValue = default(T);
      return false;
    }
  }
}

К сожалению, это недопустимо, поскольку я получаю знакомую ошибку:

Optional parameters must appear after all required parameters

Обычно это имеет смысл, но не здесь.Я считаю, что язык должен быть достаточно «умным», чтобы определить, что все в порядке - что ключевое слово out 1012 * должно быть последним и что оно не может иметь значение по умолчанию.Для заметки, это то, что происходит, если вы пытаетесь установить значение по умолчанию:

A ref or out parameter cannot have a default value

Кто-нибудь сталкивался с этим самостоятельно?Если так, как они исправили это?Если нет, я должен поднять это в Microsoft Connect?

Я действительно понимаю, что, если это не сработает, мне придется создать еще один метод, но без параметра ignoreCase, изатем просто выполните возврат в одну строку, но передайте true для ignoreCase.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 21 января 2011

Как насчет этого à l'ancienne :

public static bool TryParse(string value, out T returnedValue)
{
    return TryParse(value, true, out returnedValue);
}

public static bool TryParse(string value, bool ignoreCase, out T returnedValue)
{
    ...
}
2 голосов
/ 21 января 2011

Проблема действительно в заказе. Попробуйте это:

public static bool TryParse(string value,
                            out T returnedValue,
                            bool ignoreCase = true)

out параметры не должны быть последними - params параметры делают. (И они все еще могут прийти после необязательных параметров.)

...