「なぜそうでないのか」という質問は差し控えます。なぜなら、最初は答えが満足できるものではないからです。すでに「仕様はあなたが言いたいことを言っていないので、機能はあなたが望んでいる方法ではない」という答えを得ています。 、私は特に満足のいく答えではなかったと思います。第2に、デザインチームは、世界が希望どおりになっていない理由を正当化する必要はありません。機能は無料では存在せず、その言語から設計されています。むしろ、機能を最初に正当化し、次に設計する必要があります。
それでは、「なぜしない」の質問をもう少しはっきりさせてみましょう。既存の機能は、「配列初期化子は、(a)初期化でのequalsの右側、または(b)配列型のオブジェクト構築の右側で使用できます。提案された機能は、「配列初期化子も式として使用できます」です。問題は、「エリックは提案された機能に対してどのような批判をするでしょうか?」
私が最初に批判するのは、表現のタイプが何であるかがはっきりしないということです。変数初期化子には変数のタイプがあり、オブジェクト作成式にはオブジェクトのタイプがあります。これらの両方から、構築された配列のタイプを推定できます。どちらのヒントもなく、どのタイプを推測する必要がありますか?
C#1.0では、この機能が追加されたときに、言語で行われたゼロの型推論の総計がありました。C#の初期の設計原則は「驚きなし」であり、コンパイラーは「あまりにもスマート」ではありませんでした。開発者が式を特定のタイプにすることを意図している場合、そのタイプは式の中で何らかの形で明白でなければなりません。あなたが言う時
new double[] { 1, 2, 3.4 }
どのタイプが意図されているかはかなり明確です。同様に
new Animal[] { cat, dog, null }
提案された機能はこの原則に違反しています。式には型が必要ですが、引数の型が何であるかは明確ではありません
M({cat, dog, null})
さらに:の2つのオーバーロードがありM、1つはの配列を取得しAnimal、もう1つはの配列を取得するとしIPetます。どのオーバーロードMが適用可能ですか?変換の1つは他の変換よりも優れていますか?要素のタイプはCatおよびDogです。そこにさえ現れないタイプを推論することは意味がありますか?これらはすべて設計チームが考慮しなければならない質問であり、これらは決して明白な答えを持たない質問です。提案された機能は、私たちを非常に短い順序で深海に導きます。
現在、C#3.0はこの問題を解決します。C#3.0は、コンパイラーが開発者に代わって型を推論する多数の機能を追加したためです。「驚きなし」と「単純なルール」に関する以前の原則は、LINQを機能させるために必要な他の設計原則と矛盾していました。提案する機能はC#3.0で追加されたものですか?
それはあったかもしれない。C#3.0で実際に追加された機能は次のとおりです。
new[] { x, y, z }
は、アルゴリズムを使用して配列のタイプを推測します。タイプを持つ要素の式を取り、それらのタイプのどれが他のすべての式が変換可能な一意の最も一般的なタイプであるかを判別し、そのようなタイプが存在する場合はそれを選択します。そうでない場合、エラーが発生します。
その機能をさらに緩和してnew[]オプションにすることもできます。これは行われませんでした。
ここで、C#3.0の時間枠で提案された機能を批判するように依頼された場合、(1)C#3.0コンパイラはすでにリリース全体のスケジュールを延期するという重大な危険にさらされているので、これ以上追加しないでください。ユーザーに6回のキーストロークを節約する完全に不要な機能のための設計、実装、およびテストの負担、および(2)C#3.0もコレクション初期化子を追加しました。
new List<int>() { 10, 20, 30 }
なぜ{10, 20, 30}自動的に配列になるのですか?なぜそれはいけないのList<int>ですか?または、他の多くのタイプのいずれか?なぜアレイに偏っているのですか?覚えておいてください、私たちはアレイのための構文を安置することを選択した後、我々は永遠にそれで立ち往生しています。それはなることはありませんも何も提案されている機能だけでなく、不要であるので、それももっともらしく思われる可能な将来の機能を妨げ、他。
要約すると、提案された機能は、C#1.0の設計原則の一部に直接違反しています。C#3.0に不必要な負担を追加するだけです。C#3.0以降の言語のすべてのバージョンで、提案された機能は、他の多くの価値のある機能よりも時間、労力、お金を費やすことを推奨する良い議論をしていません。
したがって、そのような機能はありません。