5

次の C# コードがあるとします。

var a = new[] {"123", "321", 1}; //no best type found for implicitly typed array

VB.NET の対応するもの:

Dim a = {"123", "321", 1} 'no errors

VB.NET はa=の型を正しく推測できるようですがObject()、C# は上記が次のように修正されるまで文句を言います。

var a = new object[] {"123", "321", 1};

上記のシナリオで C# で型を自動推論する方法はありますか?

編集: C# サンドボックスでさまざまな型を試した後の興味深い観察 - すべての要素が継承ツリーで共通の親を持ち、その親が ではない場合Object、または要素をより広い型にキャストできる場合 (を失うことなく)、型は正しく推測されます精度などInteger -> Double)。したがって、これらの両方が機能します。

var a = new[] {1, 1.0}; //will infer double[]
var a = new[] {new A(), new B()}; //will infer A[], if B inherits from A

すべての型が から継承されているため、この動作は C# では一貫していないと思いますObject。つまり、他の型とそれほど異なる先祖ではありません。これはおそらく設計上のものなので、議論の余地はありませんが、理由を知っているなら、その理由を知ることは興味深いでしょう.

4

3 に答える 3

9

いいえ。C# の暗黙的に型指定された配列では、配列初期化子のいずれかの式の型がターゲット型である必要があります。基本的に、コンパイラは、他のすべての型をそれに変換できるように、正確に 1 つの要素型を見つけようとします。

もちろん、任意の要素を次のようにキャストできます。object

var a = new[] { (object) "123", "321", 1}; 

...しかし、明示的に型指定された配列初期化子を使用することもできます。

var a = new object[] {"123", "321", 1}; 

または、実際に同時に変数を宣言している場合:

object[] a = {"123", "321", 1};
于 2012-11-20T22:44:46.097 に答える
2

いいえ。ただし、Option Explicit On、Option Strict On、Option Infer Off を使用して、VB を C# のように動作させることができます。

ベスト プラクティス: オプションの推測

于 2012-11-20T22:45:46.160 に答える
1

C#では次を使用できますdynamicdynamic[] k = { "1", 2, "3" };

ただし、VBの動作を完全に模倣しているわけではありません。 dynamic[] k = { "1", "2", "3" }; VBでは文字列の配列を取得しますが、それでもオブジェクトの配列を提供します。

そしてもちろん:

dynamic[] k = { "1", "3", "3" };
int i = k[0].I_do_not_exist();

問題なくコンパイルされますが、ほとんどの場合、惨めに失敗します;)

于 2012-11-21T12:43:59.233 に答える