更新された回答:
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
場合の結果の値を示す の2 つを返す必要がありました。(結果を伝える別の方法が思い浮かびませんよね?) メソッドは 1 つのものしか返すことができず、カスタムの結果の型はこれにはやり過ぎのように思われるため、 を返し、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");