2017-07-15 10 views
3

私はVB => C#トランスレータで作業していますが、VBでいくつかのコードを実行しています。VBの{} .Contains()と同じです。

あなたが

If {"a", "b", "c"}.Contains("c") Then ... 

ような何かを(とのは常に真ではありません何か役に立つことをふりをしましょう)することができますVBで

私は思ったんだけど何これと同等がある場合ですC#で。私が思い付くことができます最も近いものがある

if (new object[] {"a", "b", "c"}.Contains("c")) { ... } 
これで私の問題は私がオブジェクトに行かなければならないだろうという意味、C#で型を定義する必要がある

- 私はトランスレータを書いているので、それをintの配列、boolの配列、カスタムクラスの配列などについても同様にうまく動作する必要があります。私はすべてをより具体的な型の代わりにオブジェクトにすることをお勧めします。

コンパイラに型を特定させる方法はありますか?論理的にこのような何か:(私はこれはOKではないですけど、論理的に等価なもの...)

if (new var[] {"a", "b", "c"}.Contains("c")) { ... } 

は、それは文字列の配列として配列を扱い、同様に文字列としてパラメータが含まれていますか?

サイド質問:上記のVBコードでは{"a", "b", "c"}stringの配列として扱っているようです。これは正しいです?上のVBコードでは、 "a"、 "b"、 "c"をオブジェクトとして扱っていますか?もしそうなら、私はC#でもobjectを使用します。

+0

オブジェクトを文字列に変換するには、ToString()を使用します。 – jdweng

+8

'new [] {...}' –

答えて

9

すべての配列要素は、同じ型になる場合、またはそれらは異なるタイプだが、途中そのsatifiesの型推論では、あなたが暗黙的に型指定された配列使用できるかどうか - 基本的には、varのようなもののアレイ用:

if (new[] { "a", "b", "b" }.Contains("c")) 

意味的にはVBコードと同じであるかどうかはわかりませんが、

+0

ありがとう!これはうまくいくはずです:) – BrianH

+1

技術的な詳細C#コンパイラは、3つのエントリのコンパイル時の型を調べ、 'string'が最適な型であると判断します。したがって、新しい文字列[3](質問のように 'object []'ではなく)を作成します。 'T []'は 'IEnumerable 'なので、 'IEnumerable <>'を拡張したLINQの 'Contains'メソッドが使われます。これは、序数比較を実行する 'EqualityComparer .Default'インスタンスを使用します。つまり、2つの文字列は、文字列の "ベクトル"として等しい場合、それに応じて等価です。 –

0

に関して側の質問:あなたは型推論を使用する場合は、配列の型が のために提供されます値のリストで支配的なタイプで 決定さ

fragment from 'Arrays in Visual Basic' on Microsoft Docs

Dim numbers = New Integer() {1, 2, 4, 8} 
Dim doubles = {1.5, 2, 9.9, 18} 

配列リテラル。支配的な型は、配列リテラル内の他のすべての型を広げることができるユニークな型です。この一意の型を とすることができない場合、支配的な型は配列内の他のすべての型が狭めることができる一意の型です。これらのユニークなタイプのいずれもが に決定できない場合、支配的なタイプはObjectです。たとえば、配列リテラルに指定されている の値のリストに、 Integer,LongおよびDoubleの値が含まれている場合、結果の配列の型はDoubleになります。 IntegerLongの両方がDoubleにのみ広がります。したがって、Doubleは、 の優性タイプです。詳細については、Widening and Narrowing Conversionsを参照してください。

関連する問題