编译器值类型解析和硬编码“0”整数值

2024-05-18

首先,介绍一些背景知识。阅读问题并接受答案发布在这里 https://stackoverflow.com/questions/8352260/why-does-the-sqlparameter-name-value-constructor-treat-0-as-null对于我的问题的具体场景。我不确定是否存在其他类似的案例,但这是我所知道的唯一案例。

上述“怪癖”是我很长时间以来就意识到的。直到最近我才完全理解其中的原因。

微软的文档介绍了SqlParameter课堂让我们对这种情况有了更多的了解。

当您指定一个Object在 value 参数中,SqlDbType是 从对象的 Microsoft .NET Framework 类型推断。

使用此重载时请小心SqlParameter构造函数 指定整数参数值。因为这种过载需要一个 类型值Object,您必须将积分值转换为Object type 当该值为零时,如以下 C# 示例所示。

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

如果你这样做 不执行此转换,编译器假设你正在尝试 调用 SqlParameter(string, SqlDbType) 构造函数重载。

(强调补充)

我的问题是,为什么编译器假设当您指定硬编码“0”(并且仅值“0”)时,您试图指定枚举类型,而不是整数类型?在这种情况下,它假设您声明SqlDbType值,而不是值 0。

这是不直观的,更糟糕​​的是,错误是不一致的。我有一些我编写的旧应用程序,这些应用程序多年来一直调用存储过程。我将对应用程序进行更改(通常甚至与我的 SQL Server 类无关),发布更新,这个问题会突然破坏应用程序。

当包含多个方法签名的对象包含两个相似的签名(其中一个参数是对象/整数,另一个接受枚举)时,为什么编译器会对值 0 感到困惑?

正如我所提到的,我从未认为这是任何其他类上的任何其他构造函数或方法的问题。这是独一无二的吗SqlParameter类还是这是 C#/.Net 中继承的错误?


这是因为零整数可以隐式转换为枚举:

enum SqlDbType
{
    Zero = 0,
    One = 1
}

class TestClass
{
    public TestClass(string s, object o)
    { System.Console.WriteLine("{0} => TestClass(object)", s); } 

    public TestClass(string s, SqlDbType e)
    { System.Console.WriteLine("{0} => TestClass(Enum SqlDbType)", s); }
}

// This is perfectly valid:
SqlDbType valid = 0;
// Whilst this is not:
SqlDbType ohNoYouDont = 1;

var a1 = new TestClass("0", 0);
// 0 => TestClass(Enum SqlDbType)
var a2 = new TestClass("1", 1); 
// => 1 => TestClass(object)

(改编自Visual C# 2008 重大更改 - 更改 12 http://msdn.microsoft.com/en-us/library/cc713578.aspx#sectionToggle1)

当编译器执行重载决策时 0 是适用函数成员 http://msdn.microsoft.com/en-us/library/aa691337%28v=vs.71%29.aspx对于两个SqlDbTypeobject构造函数,因为:

存在从参数类型到相应形参类型的隐式转换(第 6.1 节)

(Both SqlDbType x = 0 and object x = 0有效)

The SqlDbType参数优于object参数因为更好的转换规则 http://msdn.microsoft.com/en-us/library/aa691339%28v=vs.71%29.aspx:

  • If T1 and T2 are the same type, neither conversion is better.
    • object and SqlDbType不是同一类型
  • If S is T1, C1 is the better conversion.
    • 0不是一个object
  • If S is T2, C2 is the better conversion.
    • 0不是一个SqlDbType
  • If an implicit conversion from T1 to T2 exists, and no implicit conversion from T2 to T1 exists, C1 is the better conversion.
    • 没有隐式转换object to SqlDbType exists
  • If an implicit conversion from T2 to T1 exists, and no implicit conversion from T1 to T2 exists, C2 is the better conversion.
    • 隐式转换自SqlDbType to object存在,所以SqlDbType是更好的转换

注意什么exactly构成一个常数 0 已经(非常微妙地)改变了视觉 C# 2008 http://msdn.microsoft.com/en-us/library/cc713578.aspx#sectionToggle1(微软对 C# 规范的实现)正如 @Eric 在他的回答中解释的那样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译器值类型解析和硬编码“0”整数值 的相关文章

  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 如何在.NET Core上直接调用F#编译器?

    UPD 我想直接从 NET Core SDK 调用 F 编译器 即 fsc 我了解 dotnet build co 但当我只需要编译一个简单的问题时 即 fsc file fs 就足够的情况下 我不想涉及它们 我尝试在 NET Core S
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 通过 C/C++ API 对 Z3 中的 LIA 进行量词消除

    我想使用 Z3 通过 C C API 消除线性整数算术公式中的量词 考虑一个简单的例子 Exists x x 0 我尝试这样做 context ctx ctx set ELIM QUANTIFIERS true expr x ctx int
  • 如何在Python中的某个字符后分割字符串

    如果我有一个字符串 我们就说 b a hello b Hi 我怎样才能将字符串拆分为所有bs AFTER该字母第一次出现a 就像 它会返回 b a hello Hi 此处记录了这一点 str rsplit https docs python
  • Fluidtypo3 Flux - 保存在表字段中

    我正在尝试使用typo3 fluidcontent开发一个前端扩展 是否可以使用 tt content 表的 bodytext 字段而不是 flexform 字段 我想将此文本元素与tt content bodytext field
  • 使用多个可选模式时顺序的重要性

    可选模式的顺序如何DateTimeFormatter影响解析操作吗 我正在运行这个程序 想知道为什么最后一行抛出异常而不是前三行 public static void main String args String p1 EEEE E dd
  • 如何调试symfony2服务容器中配置的标签和服务?

    我正在编写一个服务来处理 AccessDeniedException 并且我找到了一种方法来解决它使用 Symfony2 的 AccessDeniedHandlerInterface https stackoverflow com ques
  • 删除字符串末尾的句点和数字

    如何删除尾随句点 后面紧跟一个数字 长度为一位或两位数字 例子 z lt c awe p 56 red 45 ted 5 you 88 tom 我只想删除 45和 5 你只需要一个简单的正则表达式 z new gsub 0 9 z 一些评论
  • JSTree - 如何强制用户只选择树的叶子

    在我的 JStree 中 我希望用户只能选择树的叶子 例如 没有子节点的节点 我的想法是绑定 select 事件并手动检查所选节点是否有子节点 然后相应地选择 不选择该节点 有没有更简单的方法 或者这个明显的解决方案是唯一的吗 2014 版
  • @mailchimp/mailchimp_marketing/types.d.ts'不是nodeJs中的模块

    我在 NodeJS 应用程序中导入了 import mailchimp mailchim marketing import mailchimp from mailchimp mailchimp marketing 但是 它给出以下错误 ty
  • 如何在android网络库(ION)中使用自签名SSL?

    使用此网络库 https github com koush ion https github com koush ion 由于当前状态是开发 我想使用自签名 SSL 证书 图书馆论坛有一些讨论 https github com koush
  • 如何正确安全地使用sscanf

    首先 关于使用的其他问题sscanf不要回答我的问题 因为常见的答案是不使用sscanf完全并使用fgets or getch相反 这对我来说是不可能的 问题是我的 C 教授希望我使用scanf在一个程序中 这是一个要求 然而 程序还必须处
  • 在上下文中提取搜索字符串

    我正在尝试执行 MySQL 查询 在上下文中提取搜索字符串 因此 如果搜索是 mysql 我想从 body 列返回类似的内容 下载后只需几分钟MySQL安装程序即可使用 这就是我现在得到的 但它不起作用 因为它只是从正文字段中获取前 20
  • C程序调用shell脚本

    我有一个小型 C 程序 调用 shell 脚本 myScript sh 我得到的 ret 值为 256 请帮助我了解系统调用出了什么问题 int main int ret ret system myScript sh ret gt gt r
  • 错误关系不存在

    我得到了 error relation causes does not exist 我的节点应用程序出现错误 这种关系确实存在 我不确定问题出在哪里 我创建了该表 CREATE TABLE causes cause id bigint NO
  • 使用 NLog .NET Core 将日志记录到 PostgreSQL DB

    我尝试将日志记录集成到 NET Core 中的数据库 我能够设置 NLog 并将消息记录到 SQL Server 这很容易 但是当我尝试将 DB 切换到 PostgreSQL 时 似乎没有记录任何内容 以下是startup cs中的代码 p
  • 使用 boost asio 捕获 Ctrl-C

    I m trying to catch the Ctrl C in application as demonstrated in the following MWE include
  • 在头文件中声明和定义并仅在其 cpp 文件中使用的变量存在多重定义错误

    我正在将为一个芯片编译而编写的代码移动到另一芯片上 出现的一个问题是存在大量的多重定义错误 其中一些似乎是由于第一个芯片的链接器让我在跨多个源文件使用变量时懒于声明变量 extern 我以前根本没有使用 extern 在 Something
  • 带有 LDAP 身份验证的 SVN 不起作用

    我首先从我的设置开始 为此我们有 2 台服务器 Server1 将用于所有源代码 文件等 在 Server2 上 我们拥有所有用户信息和登录信息 两台服务器都运行在 Centos 6 4 上 现在我们要在 server1 上设置一个 SVN
  • 如何使用深度等于 (Angular 7)

    通过 VS Code 自动导入 import deepEqual require deep equal 不起作用 错误 TS1202 定位时无法使用导入分配 ECMAScript 模块 考虑使用 import as ns from mod
  • WCF 缓慢的 ServiceHost.Open() 调用

    这是一个与此类似的问题 WCF 服务的 Win32Exception ServiceHost Open https stackoverflow com questions 1542242 win32exception servicehost
  • 编译器值类型解析和硬编码“0”整数值

    首先 介绍一些背景知识 阅读问题并接受答案发布在这里 https stackoverflow com questions 8352260 why does the sqlparameter name value constructor tr