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 Constructor

4

2 回答 2

56

使用 SqlParameter 构造函数的此重载来指定整数参数值时要小心。由于此重载采用 Object 类型的值,因此必须在值为零时将整数值转换为 Object 类型,如以下 C# 示例所示。

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

如果您不执行此转换,编译器会假定您正在尝试调用 SqlParameter (string, SqlDbType) 构造函数重载。

谢谢女士:)

于 2011-03-18T19:26:52.267 回答
7

您传入的 0 是类型,而不是值。任何枚举类型都允许使用 0 字面量(和常量值)——这意味着底层枚举类型的 0,并且是比对象更好的“匹配”,因为它不需要装箱。

就个人而言,我会使用;

Value = 0

也许在对象初始化器中。

于 2011-03-18T19:29:43.380 回答