31

との通常の退屈な違いをCast超えAs

  • リンゴ果物であることがわかっている場合は使用できます-そうでない場合は例外がスローされます(Fruit)apple
  • as value成功したかどうかを確認するためにnullに対してチェックできます[例外をスローしません...]

ただし、これに関する @EricLippert の記事を読んでいて、Nullable Value Types に関する素敵なサンプルがありました。

short? s = (short?)123;
int? i = s as int?;

これはコンパイルされません...

タイプ 'short?' を変換できません 'int?' に 参照変換、ボックス化変換、ボックス化解除変換、ラッピング変換、または null 型変換を介して

罰金。

だからなぜこれ:

    short? s = (short?)123;
    int? i = (int?)s;

コンパイルしますか? すべての期待に反して!私はそうsはない ことを知っていint? ます-そしてそれはBANGになるはずですが、そうではありません...)

ここでチェックしているキャストは、前の例 (Bang になった) よりもはるかに致命的であるはずです。

この話題の話題について質問するのは気分が悪い.

前もって感謝します。

4

5 に答える 5

27

最初の例では、オペレーターはオブジェクトを としてas使用しようとします。は の継承チェーンのどこにもないため、この操作は失敗します。sint?int?short?

2 番目の例では、実際にはint? ifrom の値で new を作成していますshort? ss左側の元のオブジェクトを保持する必要がないため、これはより寛大な操作です。

ここで重要な点はas、オブジェクトの ID を保持しないことは許可されていないということです。明示的なキャストが可能です。

(int?)フォームがどのように機能するかについて、C# 標準は次のように述べています。

6.1.4 暗黙の null 許容変換

null 非許容値型で動作する定義済みの暗黙的な変換は、それらの型の null 許容形式でも使用できます。Null 非許容値型 S から Null 非許容値型 T に変換する定義済みの暗黙的な ID および数値変換のそれぞれについて、次の暗黙的な Null 許容型変換が存在します。

· S からの暗黙の変換? T? に。

· S から T? への暗黙の変換。

S から T への基になる変換に基づく暗黙の null 許容変換の評価は、次のように進みます。

· Nullable 変換が S からの場合は? T?:

o ソース値が null (HasValue プロパティが false) の場合、結果は T? 型の null 値になります。

o それ以外の場合、変換は S? からのアンラップとして評価されます。S から T への基本的な変換が続き、その後に T から T? へのラッピング (§4.1.10) が続きます。

· Null 許容型の変換が S から T? への変換である場合、その変換は、S から T への基になる変換の後に T から T? へのラップが続くものとして評価されます。

于 2012-04-08T18:55:42.247 に答える
4

例:

int? i = (int?)s;

sキャストは、コンパイラが推論できないこと、つまりint?.

キャストが成功しない場合、実行時にのみ例外が発生します。

于 2012-04-08T18:55:00.330 に答える
0

as失敗した場合に「有効な」null結果が得られるのが原因だと思うので、偽陽性です。2 番目のケースでは、失敗した場合にキャストが許可され、例外が発生します。

于 2012-04-08T18:55:26.490 に答える
0

その理由はそのintですか?System.Nullable<int>は(System.Nullable<T>は型) の省略形です。short 型は int への明示的なキャストを定義しますがSystem.Nullable<T>、T は他の値型になる可能性があるため、そのような明示的なキャストはありません。

于 2012-04-08T19:27:42.000 に答える