1

私は派生クラスを使用しており、as キーワードを使用して基本クラスをそれにキャストしています。これを行うと、派生クラスのコンストラクターが呼び出され、オブジェクトが初期化されますが、派生インスタンスは初期化されたオブジェクトにはなりません (null があります)。これがコードサンプルです。

// classes
public class Request
{
  public Request();
  public Header Header{get;set;}
}

public class CreateRequest : Request
{
  public Foo Foo{get;set;}
  public Bar Bar{get;set;}

  public CreateRequest():base()
  {
    this.Foo = new Foo();
    this.Bar = new Bar();
  }
}

public class SomeClass
{
  private Response ProcessCreateRequest(Request request)
  {
    // request comes from a json request
    CreateRequest createRequest = request as CreateRequest;
    // values of Foo and Bar are null
    [...]
  }
}

「as」が通常、base->derived ではなく、derived->base に使用されるという問題はありますか、それともここで何か他のことが機能していますか?

4

5 に答える 5

7

jon skeetがこの質問に正しく答えるまで、私が知る限り、「as」キーワードは、キャストが無効な場合に例外を抑制するキャストを行う方法にすぎません。それ自体でコンストラクターを呼び出すべきではありません

渡されたオブジェクトがキャストの前に適切に初期化されていることを (デバッガーなどで) 確認しましたか?

于 2009-08-17T17:01:23.240 に答える
3

明確にするために、asオペレーターは問題のオブジェクトのメソッドを呼び出しません。オブジェクトを要求された型に変換できるかどうかを確認するだけで、変換できる場合はその型としてインスタンスを返すか、変換できない場合は返しますnull(C# 言語仕様のセクション 7.9.11「as 演算子」を参照してください)。

表示したコードから、JSON 要求の逆シリアル化メソッドが明示的に null に設定しない限り、プロパティCreateRequestを持つ理由がないように見えます。nullこれが事実であることを示すには、次のように呼び出します。

var response = ProcessCreateRequest(new CreateRequest());
System.Diagnostics.Debug.Assert(response.Foo != null);
System.Diagnostics.Debug.Assert(response.Bar != null);

asオペレーターとデフォルトのコンストラクターの両方が正しく機能していることがわかります。

于 2009-08-17T17:02:24.860 に答える
1

問題は、「as」を使用してもコンストラクターが呼び出されないことです。オブジェクトを新しい型にキャストするだけです (この場合は、Request から CreateRequest に)。

あなたの場合、 Request にはフィールドの値がないため、キャスト後に null になります。

于 2009-08-17T17:02:44.297 に答える
0

"as" キーワードを使用して、基本クラスのインスタンスを派生クラスのインスタンスに変換することはできません。そもそもオブジェクトが派生クラスのインスタンスではない場合、「as」キーワードはそれを派生クラスに変換しません。

于 2009-08-17T17:08:26.097 に答える
-1

また、ステファンが言ったことに加えて (「as」を使用してコンストラクターをトリガーすることはできません)、

... 今年の質問で、あなたは次のように述べています

「私は派生クラスを使用しており、それに基本クラスをキャストしています...」

基本クラスを派生クラスにキャストすることはできません。逆の場合のみです。そのため、(うまくいけば) y の質問を誤って述べているか、何らかの形で仮定が無効であることが明らかになります。もっと明確にできますか?

于 2009-08-17T17:04:15.900 に答える