7

C#は以下を受け入れます:

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
}

だがしかし

String 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
}

asC#でのキーワードの動作について疑問に思っています。

Javaの場合と同じように、これは失敗します。

Object test1 = "hello";
Integer test2 = (Integer) test1;
String test3 = "hello";
Integer test4 = (Integer) test3; //compilation error
4

5 に答える 5

18

コンパイラは、文字列が決してそうではないことを知っている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);

解析が失敗した場合、例外がスローされます。

また、これらの方法の両方で、フォーマットプロバイダー(通常はカルチャ情報)を指定できることにも注意してください。これにより、数値がそのフォーマットでどのように表現されるか(たとえば、千の区切り記号)を表現できます。

編集:あなたの新しい質問に答えて、コンパイラは文字列がおそらくボックス化された整数になることはできないことを知っているのでこれを防ぎます-変換は決して成功しません。元の値がオブジェクトであることがわかっているだけの場合は、成功する可能性があります。

たとえば、私があなたに言ったとしましょう。「これが形です。それは正方形ですか?」それは賢明な質問です。それを尋ねるのは合理的です:あなたは形を見ずに言うことはできません。

しかし、私が言った場合:「これが三角形です:それは正方形ですか?」そうすれば、三角形はおそらく正方形にはなり得ないので、あなたは私の顔で笑う権利が合理的に与えられます-質問は意味がありません。

于 2009-05-20T13:39:16.640 に答える
2

int?null許容整数型を意味し、他の型の変数を含む可能性のあるintではありません。

intまたはstringを含むことができる変数型が必要な場合は、オブジェクト、または私が推測する文字列を使用して、型キャストで満たされた生活を送る必要があります。でも、なぜそんなことをしたいのかわかりません。

int?任意の整数値またはnull値を格納できます。これは、「この人が何回注文したか」という質問に対する答えが、注文数ではなく合法的に「わからない」、または「この人が一度も行ったことがないという事実を知っている」という答えを言うときに役立ちます。注文しました」。

于 2009-05-20T13:37:42.430 に答える
0

ただし、nullの値を確認してnullに設定することはできます。

int? blah;
if (blah == null)
{}
于 2009-05-20T13:38:33.457 に答える
0

整数?は null 許容整数であり、キャストや as キーワードとは関係ありません。"String" は文字列型のオブジェクトであり、int (null 許容または非 null 許容) に変換できません。

as キーワードは、エラーを返さず、オブジェクトを null に設定する点を除いて、大括弧を使用したキャストと実質的に同じです。

int i = 1;

object o = i; //boxing

int j = (int)o; //unboxing

この最初の例は、o に割り当てられたオブジェクトが int であるため機能します。

今考えてみましょう:

string i = "MyString";

object o = MyString;

 int j = (int)o //unboxing raises exception

 int j = o as int; //raises compilation Error as int is not nullable
 int? j = o as int?; /// o == null

2 つの概念の違いを説明するのに役立つことを願っています。

リチャード

于 2009-05-20T13:52:52.960 に答える