C # 4.0 допускает необязательные out
или ref
аргументы?
c#-4.0
optional-parameters
optional-arguments
Джо Дейли
источник
источник
null
умолчанию ( я пришел из PHP ) и протестировав,null
чтобы продолжить заполнение аргумента ( для тех, кто знаком, подумайтеpreg_match()
). В любом случае, хотя я понимаю, с технической точки зрения, в настоящее время это может быть невозможно, и что PHP и C # довольно несопоставимы, это все равно было бы « хорошим » инструментом, доступным.Ответы:
Как уже упоминалось, это просто не разрешено, и я думаю, что это имеет очень хороший смысл. Однако, чтобы добавить некоторые подробности, вот цитата из спецификации C # 4.0 , раздел 21.1:
источник
Нет.
Обходной путь - перегрузить другим методом, который не имеет параметров out / ref и который просто вызывает ваш текущий метод.
Обновление: если у вас есть C # 7.0 , вы можете упростить:
(Спасибо @Oskar / @Reiner за это.)
источник
return SomeMethod(out string temp)
. Подробнее здесь: blogs.msdn.microsoft.com/dotnet/2016/08/24/…return SomeMethod(out _);
Нет, но другой замечательной альтернативой является использование метода общего шаблонного класса для необязательных параметров следующим образом:
Тогда вы можете использовать его следующим образом:
источник
На самом деле есть способ сделать это, что разрешено в C #. Это возвращается к C ++ и скорее нарушает красивую объектно-ориентированную структуру C #.
Используйте этот метод с осторожностью!
Вот как вы объявляете и пишете свою функцию с необязательным параметром:
Затем вызовите функцию следующим образом:
Чтобы это скомпилировать, вам нужно включить небезопасный код в опциях проекта. Это действительно хакерское решение, которое обычно не следует использовать, но если вам нужно какое-то странное, загадочное, таинственное, вдохновленное руководством решение, ДЕЙСТВИТЕЛЬНО нужен необязательный параметр out в C #, тогда это позволит вам сделать именно это.
источник
ICYMI: Включенный в перечисленные здесь новые функции для C # 7.0 , "discards" теперь разрешен как параметры out в форме _, чтобы позволить вам игнорировать параметры, которые вам не нужны:
p.GetCoordinates(out var x, out _); // I only care about x
PS, если вас также смущает часть «out var x», прочитайте новую ссылку «Out Variables» по ссылке.
источник
Нет, но вы можете использовать делегата (например
Action
) в качестве альтернативы.Вдохновленный ответом Робина Р., когда я столкнулся с ситуацией, когда я думал, что мне нужен необязательный параметр out, я вместо этого использовал
Action
делегата. Я позаимствовал его пример кода, чтобы изменить его для использованияAction<int>
, чтобы показать различия и сходства:Преимущество этого заключается в том, что необязательная переменная появляется в источнике как обычное целое число (компилятор оборачивает его в класс замыкания, а не в явном виде в класс, определенный пользователем).
Переменная нуждается в явной инициализации, потому что компилятор не может предполагать, что
Action
он будет вызван до завершения вызова функции.Он подходит не для всех вариантов использования, но хорошо работал для моего реального варианта использования (функция, которая предоставляет данные для модульного теста, и где новому модульному тесту необходим доступ к некоторому внутреннему состоянию, отсутствующему в возвращаемом значении).
источник
Используйте перегруженный метод без параметра out, чтобы вызвать метод с параметром out для C # 6.0 и ниже. Я не уверен, почему C # 7.0 для .NET Core является даже правильным ответом для этой темы, когда его специально спросили, может ли C # 4.0 иметь необязательный параметр out. Ответ - нет!
источник
Как насчет этого?
Вы все еще должны передать значение параметру из C #, но это необязательный параметр ref.
источник
[Optional]
аннотацию. Это не помогает.источник