コンパイラは、文字列が決してそうではないことを知っているint?
ので、それを教えてくれます。それがint?
役に立たないという意味ではありません。試行したユースケースは、通常のユースケースとはほど遠いものです。通常は「整数と値が欠落/不明である可能性を表現したい」です。そのため、int?
非常にうまく機能します。
元のコードが機能すると期待するのはなぜですか?なぜそれが役立つのでしょうか?
ボックス化を解除するために、null許容型で使用できることに注意してください。as
object o = "hello";
int? i = o as int?;
if (i == null)
{
// o was not a boxed int
}
else
{
// Can use i.Value to recover the original boxed value
}
編集:あなたのコメントを見た後、あなたはas
物事を解析するために使用しません。あなたはおそらく使いたいでしょうint.TryParse
:
string text = "123":
int value;
if (int.TryParse(text, out value))
{
Console.WriteLine("Parsed successfully: {0}", value);
}
else
{
Console.WriteLine("Unable to parse text as an integer");
}
文字列が整数であることが確実な場合(つまり、それ以外の場合はバグです)、次を使用できますint.Parse
。
int value = int.Parse(text);
解析が失敗した場合、例外がスローされます。
また、これらの方法の両方で、フォーマットプロバイダー(通常はカルチャ情報)を指定できることにも注意してください。これにより、数値がそのフォーマットでどのように表現されるか(たとえば、千の区切り記号)を表現できます。
編集:あなたの新しい質問に答えて、コンパイラは文字列がおそらくボックス化された整数になることはできないことを知っているのでこれを防ぎます-変換は決して成功しません。元の値がオブジェクトであることがわかっているだけの場合は、成功する可能性があります。
たとえば、私があなたに言ったとしましょう。「これが形です。それは正方形ですか?」それは賢明な質問です。それを尋ねるのは合理的です:あなたは形を見ずに言うことはできません。
しかし、私が言った場合:「これが三角形です:それは正方形ですか?」そうすれば、三角形はおそらく正方形にはなり得ないので、あなたは私の顔で笑う権利が合理的に与えられます-質問は意味がありません。