1

手動で、オブジェクトが私が期待するものではないかのように対応する必要があるかのようなコードを意味します。

たとえば、私はリピーターと協力しています。その一環として、DataSource プロパティを操作しています。これを行うには、最初に次のことを確認する必要があります。

this.DataSource as List<MyObject>

MyObject オブジェクトのリストでない場合、これは null を返します。キャストすると、それが MyObject オブジェクトのリストではない場合、例外がスローされます。

これは、それが MyObject オブジェクトの List であるかどうかがその時点でわかっていることを意味します。

質問

では、すでに既知の型であると考えていたので、this.DataSource を使用してコーディングすることを許可しないのはなぜですか? お気に入り:

this.DataSource.First().Member

この質問には明らかにレトリックはありません。私はこれを行うことができるはずだと言っているのではありません。私は本当に答えに興味があります。

4

2 に答える 2

8

C# は静的に型付けされた言語です。これは意図的なものです。静的型付けには、保守性、ツール、パフォーマンス、およびおそらくその他の面でも利点があります。

動的型付け言語では、実際にそのようなコードを書くことができます。C# 言語は確かにこのように定義できますが、そうしないように選択されました。

静的型付けと動的型付けのトレードオフは複雑であり、この回答で詳しく説明することはできません。これは、Web 上でさまざまな場所で広く議論されています。

C# 4 以降では、動的セマンティクスも強制できます。

dynamic ds = this.DataSource;
Console.WriteLine(ds.First().Member); //compiles and works or fails at runtime

静的型付けの力を可能な限り活用することをお勧めします。dynamic特別な状況のための脱出ハッチのようなものです。

于 2013-11-11T13:37:26.310 に答える
3

Repeater.DataSourceは として定義されているためobject、存在する最も基本的なクラスです。

コンパイラは、そこに入力した特定の型を認識しないため、静的に型指定されたアクセスが必要な場合は、キャストする必要があります。

于 2013-11-11T13:36:02.837 に答える