なぜすることはできないのでしょうかを使用してキーワードは、struct?
-
25-09-2019 - |
質問
私の定義は以下の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値タイプです。
オペレータがために使用されるように、§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;