首先,一点背景。阅读此处发布的问题和接受的答案,了解我的问题的具体情况。我不确定是否存在其他类似的案例,但这是我知道的唯一案例。
上面的“怪癖”是我很早就意识到的。直到最近,我才完全了解原因。
微软关于SqlParameter
该类的文档更加清楚地说明了这种情况。
当您
Object
在 value 参数中指定 an 时,SqlDbType
会从 Object 的 Microsoft .NET Framework 类型推断出。使用
SqlParameter
构造函数的此重载来指定整数参数值时要小心。由于此重载采用 type 的值Object
,因此必须在值为 0 时Object
将整数值转换为 类型,如以下 C# 示例所示。
Parameter = new SqlParameter("@pname", Convert.ToInt32(0));
如果您不执行此转换,编译器会假定您正在尝试调用 SqlParameter (string, SqlDbType) 构造函数重载。
(强调补充)
我的问题是为什么编译器会假定当您指定硬编码的“0”(并且只有值“0”)时,您正在尝试指定枚举类型,而不是整数类型?在这种情况下,它假定您正在声明SqlDbType
值,而不是值 0。
这是不直观的,更糟糕的是,错误是不一致的。我有我编写的旧应用程序多年来一直调用存储过程。我将对应用程序进行更改(通常甚至与我的 SQL Server 类无关),发布更新,这个问题会突然破坏应用程序。
当一个包含多个方法签名的对象包含两个相似的签名,其中一个参数是对象/整数而另一个接受枚举时,为什么编译器会被值 0 混淆?
正如我所提到的,我从未将这视为任何其他类上的任何其他构造函数或方法的问题。SqlParameter
这是该类独有的还是 C#/.Net 中继承的错误?