6

これはキャスティングに関する非常にばかげた質問のようですが...

私は次の設定をしています:

メインクラスから派生したクラスがいくつかあります。時間と空間のある時点でアイテムを取得し、それをサブクラスのオブジェクトとして処理したいと考えています。

想定:

class subClassA : mainclass 
class subClassB : mainclass 

今、私はそれがどのクラスであるかを尋ねる場合があります:

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ;
}

ほとんどのサブクラスでは正しいオブジェクトが返されますが、1 つのサブクラスについてはnull-Object を取得します。

私が次のことをした場合:

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ; // <- aA = null; someObject is shown in debugger as object of subClassA

    object test = someObject as subClassA; // <- object is not null
    // or 
    subClassA aB = (subClassA)someObject; // <- object is not null, shows the correct object
}

と に結果がtestありaBます。

私が理解していないこと:

なぜas失敗し、プレフィックスキャストが成功するのですか?


今、私は完全に迷っています。

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ; // <- aA = null; someObject is shown in debugger as object of subClassA

    subClassA aB = someObject as subClassA ; // <- aB != null.
}

if(someObject is subClassA)
{
    subClassA aB = someObject as subClassA ; // <- aB != null.
}

名前 aA はローカルで定義されています。メソッドにアクセスするスレッドは 1 つだけです。aAの名前を変更するだけで機能します。

4

3 に答える 3

1

あなたが説明しているシナリオは、控えめに言っても紛らわしいので、次のことを試してください。

subClassA aA = (someObject as subClassA) ?? (subClassA)someObject;

それは機能しますか ( aAnull でないなど)?

の詳細については、次の投稿を参照してくださいas

CLR でのキャストと「as」キーワードの使用

まだ調査中ですが、シナリオを再現する方法がわかりません...

編集:

答えを見つけようとしている非常に頭の良い人たち ( SkeetLippert )から多くのことを読んでいます...

ドキュメントを参照してくださいis:

http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.110).aspx

as/ 変換ドキュメント:

http://msdn.microsoft.com/en-us/library/ms173105.aspx

于 2013-01-31T17:09:01.590 に答える
0

ほとんどの場合、正しいオブジェクトが返されますが、null オブジェクトが返されることがあります。

問題の簡単な説明は 1 つだけです。someObject参照が別のスレッドによって変更されていますそれを保護するには、 lockステートメントを使用する必要があります。

于 2013-02-01T01:30:53.043 に答える
0

MSDNから、「as」は次と同等です。

expression is type ? (type)expression : (type)null

したがって、MSDN によると、コードでは次のようになります。

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ;
}

と同等です

if(someObject is subClassA)
{
    subClassA aA = someObject is subClassA ? (subClassA)someObject : (subClassA)null ;
}

両方の行に表示されているためsomeObject is subClassA、私が考えることができる唯一のことは、1) someObject が実際には null である場合があることです。または、2) マルチスレッド アプリケーションを使用していて、コードがスレッド セーフではない (つまり、"is" 行が true になることがありますが、"as" 行に到達するまでに、暗黙的な "is" " が false になりました。)

于 2013-01-31T18:23:27.783 に答える