11

次のコードを検討してください。

  static void Main(string[] args)
  {
      var ints=new List<int> {10,11,22};
      Something(ints);//Output:Count is:3
      Something(new int[10]); //'System.Array' does not contain
                              //  a definition for 'Count'
      Console.ReadLine();     
  }
  static void Something(ICollection collection)
  {
      dynamic dynamic = collection;
      Console.WriteLine("Count is:{0}", dynamic.Count);
  }

リストを渡すと、すべて問題ありません。しかし、配列を渡して動的に変換すると、次のエラーが発生します'System.Array' does not contain a definition for 'Count'

私の解決策はわかっていますが、コンパイラがこの動作をする理由を知りたいですか?

4

4 に答える 4

3

ダイナミックはリフレクションを使用して内部的に機能します。配列クラスにはプロパティ Count がありません。これには、ICollection プロパティ Count を明示的に実装するプロパティ Length があります。これは、動的呼び出しを実行しようとすると、一致するプロパティが見つからないために失敗することを意味します。

あなたへの私の質問は、なぜこの場合に動的に使用しようとしているのかということです.あなたはすでにインターフェースをサポートするクラスに限定しています.その時点でインターフェースを使用する必要があります. この時点で、列挙子とカウントを取得できることがほぼ保証されています。それ以外は何もありません。さらに必要な場合は、より良いインターフェイスを検討してください。

于 2013-10-20T05:39:17.917 に答える
0

「私の解決策はわかっていますが、なぜコンパイラがこの動作をするのか知りたいですか?」

あなたの質問については、私が知っているように、コンパイラの動作は..動的型は実行時に処理されるため、コンパイラはコンパイル時に動的型変数を処理しません。そのため、そのエラーが表示されます。

コンパイラにこのケースを処理させたい場合は、動的型をvar型に変更できます。

簡単に言えば..動的型変数はコンパイラの責任ではありません。

于 2013-10-20T05:13:52.163 に答える