SqlParameter构造函数与对象初始化器的问题

3

给定以下代码行:

cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayID);

我收到了以下错误: SqlParameterCollection仅接受非空SqlParameter类型的对象,而不是String对象。
但是,可以通过使用对象初始化来重写它:
cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar) { Value = customer.DisplayID });

这个工作很好。有什么原因导致这种情况发生吗?


可能是因为 customer.DisplayId 为空,而 SqlDbType.NVarChar 不接受空值。 - CharithJ
2个回答

2
问题是由于括号不匹配导致的:
cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar)).Value = customer.DisplayId;

请注意,在.Value之前有2个闭合括号。按照您最初输入的方式,您正在执行cmd.Parameters.Add(...);其中...

new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayId

并且这会计算为customer.DisplayId,因此出现了有关它不接受string类型的消息。

此外,您可以更简洁地添加参数:

cmd.Parameters.AddWithValue("@displayId", customer.DisplayId);

关于为什么 new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayId 返回 customer.DisplayId,请注意,赋值运算符 的返回结果是被赋值的值,在这种情况下就是 customer.DisplayId。这就是为什么你可以同时给几个变量赋值的原因:
int i, j, k;
i = j = k = 42;

2
cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayID);

是相同的。
var customerDisplayId = customer.DisplayID;
new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customerDisplayId;
cmd.Parameters.Add(customerDisplayId);

现在你明白为什么编译器会抱怨了吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接