2016-09-14 3 views
2

、次は有効な構文であり、これは理にかなって:今一貫性のない初期化構文

string[] v = {"a","b"}; 

しかし、これを考慮してください。我々は

void method(string[] p) {...}; 

を定義すると仮定すると、その後、次は有効ではありません:上記と矛盾している

method({"a","b"}); 

ここでメソッド呼び出しを有効にすることを妨げる技術的な理由はありますか?つまり、構文の解釈にはあいまいさがありますか?あるいは、実装が不可能なメモリ管理や永続性に問題がありますか?

編集: エリック・リッペルトの答えは興味深いですが、私が実際に尋ねていなかったデザインの「なぜ」に答えています(そして、この質問は元々閉じられていました。答えの)。

L.Bの答えは実際には、なぜこの理由が許されなかったのか(理由はEric L.コメント)。しかし、LBの答えは、現在のところ、確かに、そのような構文が許されない理由は確かに正しいですが、これは実際に私が求めていた問題なので、LBの答えを正しいものとして選択します(正直なところ、厳しい選択...)。

+3

これは有効です: 'method(new [] {" a "、" b "});' –

+4

'voidメソッド(KeyValuePair p){}'どのメソッドが呼び出されたとしますか? ? (辞書の初期化を参照してください) –

+3

これは矛盾していません。型推論に基づいています。しかし、C#が型の推論をどのくらいかかり、強く入力する前に分解が始まり、L.Bがどこでそれが起こる可能性があるかという素晴らしい例が得られるまでの合理的な制限があります。 –

答えて

3

{"a","b"}ものように、ここでKeyValuePair <>

var dict = new Dictionary<string, string>() { { "a", "b" } }; 
+0

これは間違っています。 'Dictionary 'の初期化構文は 'Add()'メソッドのパラメータに対応しており、どのコレクション型でも動作します。これはエラーです: 'KeyValuePair x = {0,0}; ' –

7

短くてもよい覚えておいてください

..あなたが別の方法

void method(KeyValuePair<string,string> p) {} 

が曖昧につながるmethod({"a","b"});ようにそれを呼び出すことがあるとし答え:それは文法の奇妙なことです。私はいつもこれを「いぼ」と考えました。このことを見て、それが変だと言う方法はいくつかあります。

T x = y; 

T x; x = y; 

が異なっている:いくつかの状況のいずれかであること奇妙です。あるいは、それを見るもう1つの方法は、ローカル変数初期化子が式でない何かが現れるコンテキストであることが奇妙であるということです。

これを見る別の方法は、これが新しい配列が作成されているにもかかわらず、「新しい」という文字列がどこにも現れない唯一の状況だということです。

これを見る別の方法は、このように配列を初期化することができますが、それ以外のコレクション構造はできません。配列は、しばしば仕事のための適切なツールではありませんが、特に特別で重要なように見えます。

もう一度やり直さなければならないと思いますが、おそらくイニシャライザは左にnew[]が必要です。

Are there technical reasons that preclude the method call here from being valid syntax? That is, is there some ambiguity in interpretation of the syntax?

実際はありません。この奇妙なことをあまり読まないでください。私のアドバイスは構文全体を避けることです。適切なコレクション初期化子または配列初期化子を使用してください。それらはほぼ同じ構文を持ちますが、式が合法であればどこでも合法です。

L.Bのもう1つの答えについて:この回答は、ここでは設計上の問題があることを偶然指摘していますが、歴史的な見解は無視しています。 Critiquされている機能は、ジェネリック型推論(C#2.0)またはその他のブレースされたコレクション初期化(C#3.0)が追加される数年前のC#1.0で作成されました。したがって、何年も後に来たフィーチャとの競合に基づいて、1.0フィーチャのデザイン選択の正当性を立証することはできません。 C#デザインチームは、将来を見出そうとしていますが、彼らはではありませんでした。フォワードルッキング!

+0

" ...配列がこのように初期化できるのは本当に奇妙ですが、他のコレクション構造はできません "。 'new Office {Employees = {" Denise "、" John "}};' EmployeesはOfficeコンストラクタで作成された文字列のリストですか?このタイプの初期化はどのように呼び出されますか? –

+1

@LucaCremonesi:それはコレクションの初期化です。私の指摘は 'List myList = {1、2、3、};'と言うことはできませんが、 'int [] myArray = {1,2,3};'と言うことができるので、配列は特別です。なぜ配列は特別であるべきですが、リストは特別ではないでしょうか?特に、あなたが正しく注記しているように、オブジェクトやコレクションのイニシャライザのコンテキストで行うことができます。 –

+2

ありがとうございます。あなたの答えが真に当てはまる質問のタイプを、もはや「意見」の質問であるから尋ねることができないというのは残念です。あなたの経験を持つ人々の「意見」は貴重なものであり、SOがこれを認識しなくなったことは残念です。 –

関連する問題