Подтвердить что ты не робот

Дополнительные параметры вывода

В С# 4 есть ли хороший способ иметь необязательный выходной параметр?

4b9b3361

Ответ 1

Не совсем, хотя вы всегда можете перегрузить метод другим, который не принимает выходной параметр.

Ответ 2

Украшение параметров с помощью параметра OptionalAttribute также не работает. Чтобы расширить предыдущий образец, вы получите что-то вроде:

private void Func(
    [Optional] out int optional1, 
    [Optional] out string optional2) 
{ /* ... */ }

Обратите внимание, что приведенное выше будет компилироваться (возможно, к сожалению). Однако, пытаясь скомпилировать:

Func(out i);

завершится с ошибкой, если явно не указана перегрузка с однопараметрической сигнатурой.

To (теоретически) делает вышеупомянутую работу серьезной проблемой. Когда вызывается метод с пропущенным необязательным параметром, создается кадр стека, содержащий значения всех параметров, а отсутствующие значения просто заполняются указанными значениями по умолчанию.

Однако параметр "out" является ссылкой, а не значением. Если этот параметр является необязательным и не указан, какую переменную он ссылается? Компилятору все же необходимо выполнить требование о том, чтобы параметр "out" был заполнен перед любым нормальным возвратом из метода, поскольку компилятор не знает априори, какие (если есть) дополнительные параметры указываются вызывающим. Это означает, что нужно было бы ссылаться на фиктивную переменную где-то, поэтому метод должен что-то заполнить. Управление этим фиктивным переменным пространством создало бы неприятную головную боль для писателя компилятора. Я не говорю, что было бы невозможно разобрать детали того, как это будет работать, но архитектурные последствия достаточно велики, чтобы Microsoft понятным образом передала эту функцию.

Ответ 3

Нет.

Чтобы сделать его "необязательным", в том смысле, что вам не нужно назначать значение в методе, вы можете использовать ref.

Ответ 4

private object[] Func();

назначьте столько же, сколько вы хотите получить в массиве возвращаемых объектов, а затем используйте их! но если вы имеете в виду опциональный вывод, что-то вроде

private void Func(out int optional1, out string optional2)

а затем вы вызываете что-то вроде

Func(out i);

тогда ответ - это не вы. также С# и .NET framework имеют очень много структур данных, которые очень гибки, например List и Array, и вы можете использовать их как выходной параметр или как тип возврата, поэтому нет необходимости реализовывать способ получения необязательных параметров вывода.

Ответ 5

public class Dummy<T>
{
    public T Value;
}

Затем используйте functionDoSomething(out new Dummy<int>().Value, где int может быть любым типом.