Обновленный ответ:
В более поздних версиях C# вы можете объявить выходной параметр встроенным, что позволит вам удалить строку кода, которая вам не нужна в вашем примере:
string value = Console.ReadLine(); //Get a value from the user.
if (int.TryParse(value, out int num))
{
Console.WriteLine("An integer");
}
else
{
Console.WriteLine("Not an integer");
}
Вы можете просто проигнорировать результат в своем коде и больше не иметь этой лишней строки. У вас все еще есть лишний параметр, но так ли это?
Основное «почему» остается прежним и вряд ли когда-либо изменится. Метод должен был возвращать две вещи: bool
, указывающий на успех, и int
, указывающий результирующее значение в случае успеха. (Я не могу придумать другого способа передать результат, а вы?) Поскольку метод может возвращать только одну вещь, а пользовательский тип результата кажется излишним для этого, было принято решение вернуть bool
и получить результат быть параметром out
. И как только это решение было принято, оно должно оставаться в силе на протяжении всего языка.
«Они», безусловно, могут добавить перегрузку, которая не выводится в значении int
. Но почему? Зачем тратить усилия на проектирование, документирование, тестирование и, как мы видели, постоянную поддержку метода, который не служит никакой цели, кроме экономии нескольких нажатий клавиш для крайнего меньшинства разработчиков? Опять же, очень маловероятно.
Для таких функций вы, безусловно, можете предложить изменение. Думаю, было бы здорово, если бы предложение было принято. Я сомневаюсь, что это было бы так, но если вы увлечены этим, то, во что бы то ни стало, сделайте это.
Исходный ответ:
Короткий ответ: «Потому что так определен метод». Возможно, случайно кто-нибудь из языковой группы C# найдет этот вопрос и объяснит, почему были приняты решения, но на данный момент это мало что меняет. C# — это статически компилируемый язык, и сигнатуры методов должны совпадать, так что это именно так.
(Представьте, если бы они изменили это и сломали .TryParse()
во всех существующих кодовых базах. Это было бы... плохо.)
Однако вы можете обойти это в своем собственном коде. Что-то столь же простое, как метод расширения, может помочь вам:
public static bool IsInt(this string s)
{
int x = 0;
return int.TryParse(s, out x);
}
Затем в вашем коде вам просто нужно вызвать этот метод из строкового значения:
string value = Console.ReadLine();
if (value.IsInt())
Console.WriteLine("An integer");
else
Console.WriteLine("Not an integer");
person
David
schedule
25.10.2013
out
. - person Daniel Hilgarth   schedule 25.10.2013try { Convert.ToInt32(value); Console.WriteLine("Integer"); } catch (FormatException) { Console.WriteLine("Not an integer"); }
- person Shishir Gupta   schedule 01.09.2017int.TryParse("1", out var _);
. ссылка: blogs.msdn .microsoft.com/mazhou/2017/06/27/ - person Ray Cheng   schedule 22.02.2018