30

私はこのようなことをしていました:

SqlParameter param = new SqlParameter("@Param", 0) { SqlDbType = SqlDbType.Int };

private void TestParam(SqlParameter param) {
   string test = param.Value.ToString();  // Getting NullReferenceException here
}

しかし、次のようにすると、例外が発生しなくなります。

SqlParameter param = new SqlParameter("@Param", SqlDbType.Int)  { Value = 0 };

private void TestParam(SqlParameter param) {
    string test = param.Value.ToString();  // Everything OK
}

SqlParameterが0がnullと同じであると想定する理由を誰かに教えてもらえますか?

編集: MSDNここでこれを説明します:SqlParameterコンストラクタ

4

2 に答える 2

56

SqlParameterコンストラクターのこのオーバーロードを使用して整数パラメーター値を指定する場合は、注意が必要です。このオーバーロードはObject型の値をとるため、次のC#の例に示すように、値がゼロの場合は、整数値をObject型に変換する必要があります。

Parameter = new SqlParameter("@pname", Convert.ToInt32(0));

この変換を実行しない場合、コンパイラーは、SqlParameter(string、SqlDbType)コンストラクターのオーバーロードを呼び出そうとしていると見なします。

ありがとうMsdn :)

于 2011-03-18T19:26:52.267 に答える
7

渡す 0 は、値ではなくtypeです。0 のリテラル (および定数値) は、任意の列挙型で許可されます。これは、基になる列挙型の 0 を意味し、ボクシングを必要としないため、オブジェクトよりも「一致」します。

個人的には、私は使用します;

Value = 0

おそらくオブジェクト初期化子で。

于 2011-03-18T19:29:43.380 に答える