4

次のステートメントの最初のステートメントでコンパイル エラーがスローされ、2 番目のステートメントではスローされない理由を教えてください。

NewDatabase.AddInParameter(NewCommand, "@SomeString", DbType.String, SomeString ?? DBNull.Value); // <-- Throws compilation error!
NewDatabase.AddInParameter(NewCommand, "@SomeString", DbType.String, (object)(SomeString) ?? DBNull.Value); // <-- Compiles!

などの他のnull許容型を試してみbyte?ましたが、同じ結果が得られました。最初にオブジェクトにキャストする必要がある理由を教えてください。

4

5 に答える 5

10

使用する型をコンパイラに伝える必要があります。null 合体演算子の結果の型は、オペランドの型の1 つと同じでなければなりません(または、場合によっては、最初のオペランドの基になる型が null 許容値の型である場合)。「両方のオペランドを変換できる最も具体的な型」などを見つけようとはしません。

null 合体演算子に関する言語の定義方法の詳細については、C# 4 言語仕様のセクション 7.13を参照してください。

式の型はa ?? b、オペランドで使用できる暗黙的な変換によって異なります。の型は優先順にa ?? bis A0A、またはBで、Aは の型a( a に型がある場合)、Bは の型b(に型がある場合) b、は null 許容型の場合A0の基になる型です。、またはそれ以外。AAA

于 2011-06-13T16:23:25.557 に答える
9

と は暗黙的に交換可能な型ではないためSomeString、最初の例は失敗します。DBValue.Null

于 2011-06-13T16:22:41.090 に答える
4

これは、null 合体演算子の右側の型が左側の型に暗黙的に変換可能でなければならない (またはその逆) ためです。最初の例では、関係する型はstringDBNullです。これらの型は無関係であるため、変換は失敗します。

于 2011-06-13T16:24:08.447 に答える
2

DBValue.Null は文字列ではありません。それはオブジェクトです。.NET は、式で Object に暗黙的にキャストしません。オブジェクトの結果が必要であることを明示的に伝える必要があります。

于 2011-06-13T16:25:02.307 に答える
2

式には単一の戻り値の型が必要なためです。StringDbValueを互いにキャストできないため、コンパイラはどの型の戻り値が必要かを判断できません。オブジェクトにキャストすると、コンパイラにキャストできる型が与えられます。

于 2011-06-13T16:26:39.047 に答える