まず、背景を少し。私の質問の特定のシナリオについては、ここに投稿された質問と受け入れられた回答を読んでください。他にも同様のケースがあるかどうかはわかりませんが、これは私が知っている唯一のケースです。
上記の「クセ」は、私が以前から気になっていたことです。私はつい最近まで原因の全容を理解していませんでした。
このクラスに関する Microsoft のドキュメントはSqlParameter
、状況をもう少し明らかにしています。
Object
value パラメーターでを指定するとSqlDbType
、 はオブジェクトの Microsoft .NET Framework 型から推測されます。コンストラクターのこのオーバーロードを使用して
SqlParameter
整数パラメーター値を指定する場合は注意してください。このオーバーロードは type の値を取るため、次の C# の例に示すように、値が zero の場合はObject
整数値をObject
型に変換する必要があります。
Parameter = new SqlParameter("@pname", Convert.ToInt32(0));
この変換を実行しない場合、コンパイラは、SqlParameter (文字列、SqlDbType) コンストラクターのオーバーロードを呼び出そうとしていると見なします。
(強調を追加)
私の質問は、ハードコードされた "0" (および値 "0" のみ) を指定すると、整数型ではなく列挙型を指定しようとしているとコンパイラが想定するのはなぜですか? SqlDbType
この場合、値 0 ではなく、値を宣言していると見なされます。
これは直感的ではなく、さらに悪いことに、エラーには一貫性がありません。私は、何年もの間ストアド プロシージャを呼び出してきた、私が作成した古いアプリケーションを持っています。アプリケーションに変更を加え (多くの場合、SQL Server クラスに関連付けられていません)、更新プログラムを公開すると、この問題によってアプリケーションが突然壊れます。
複数のメソッド シグネチャを含むオブジェクトに、1 つのパラメータがオブジェクト/整数で、もう 1 つのパラメータが列挙を受け入れる 2 つの同様のシグネチャが含まれている場合、コンパイラが値 0 によって混乱するのはなぜですか?
前述したように、これが他のコンストラクターや他のクラスのメソッドに問題があるとは考えていません。これはクラスに固有のものSqlParameter
ですか、それとも C#/.Net 内のバグ継承ですか?