質問

私の定義は以下のstruct:

public struct Call
{
    public SourceFile caller;
    public SourceFile callee;

    public Call(SourceFile caller, SourceFile callee)
    {
        this.caller = caller;
        this.callee = callee;
    }
}

その後、私に割り当てのタグの性別のオブジェクト:

line.Tag = new Call(sf1, sf2);

がようにしているタグを取得物件のようなので、

Call call = line.Tag as Call;

Visual Studio以下のコンパイル時にエラー:

のオペレーターとしては、 参照型またはnullタイプ

は、何を意味しているのでしょうか?どうしたいので解決です。

役に立ちましたか?

解決

Structである値型でご使用いただくことはできませんの as オペレーターの as オペレーターができることを割り当てる値がnullの場合はキャストは失敗します。ことが可能になるので参照型またはnullの値型です。

あるカップルでこれを解決する方法があなたの最善の策は変更 Call タイプから構造体をクラスです。これは本質的には変更のタイプから値型への参照型できるの as オペレーターを割り当てる値がnullの場合はキャストは失敗します。

詳しい情報価値の種類前参考種類 この がりのもの。また、いつMSDN:

他のヒント

一部の既存の回答な なかなか ます。使用できません 非null タイプ as, での結果 as する場合は、nullの値型の場合は、この最初のオペラなのに適切なタイプです。

ただし、 ができ 使用 as 価値種類が---だnullable:

int a = 10;
object o = a;

int? x = o as int?; // x is a Nullable<int> with value 10
long? y = o as long?; // y is a Nullable<long> with the null value

です 用途:

Call? call = line.Tag as Call?;

それとしても使用可能:

if (call != null)
{
    // Do stuff with call.Value
}

二点もの:

  • 私の経験であっ用 is その後キャスト
  • き、真剣に考え現在 Call タイプ:
    • この露出公共分野、一般的に貧しい封止
    • で変更可能な値型は、ほぼ確実に間違い

いることが強く示唆するクラスではなく-その時点でこの問題のたいています。

別の思考:タグの場合は 常にCall, そのようにキャストで

Call call = (Call) line.Tag;

この場合、データが一致しないとの期待(あのバグなどの Tag ではない Call しかも、早くよんだ後は、潜在的に行うものです。なお、このキャストまにより異なる動作をするかどうか Call ある構造体やクラスの場合 Tag がnullの場合はできるキャストにnull値を変数への参照型またはnullの値型においても同様であり、非null値タイプです。

C#スペック

から

  オペレータがために使用されるように、

§7.10.11   明示的に与えられに値を変換します   の参照タイプまたは null許容タイプする。キャスト式とは異なり、   (§7.7.6)、などのオペレータが投げたことがありません   例外。代わりに、もし   指定された変換が可能ではありません、   得られた値はのヌル

参照とNULL可能タイプはnullにすることができます。 Stuctsは値型ですので、彼らはnullにすることはできません。

Call? call = line.Tag as Call?;

これは、C#の制限です。型は参照型であれば、その後、キャストが失敗した場合、それは単に「ヌル」を返しますが、それは値型なので、それはキャストが失敗したときに返すために何を知りません。

あなたは2と同様の使用を置き換える必要があります。「」であり、

「として」
if (line.Tag is Call) {
  call = (Call)line.Tag;
} else {
  // Do whatever you would do if as returned null.
}

の意味は何ですか - 。述べたように、構造体は値型です。

どのように私はそれを解決することができます -

に変更し、それ
Call call = line.Tag;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top