`
镭风【CHN】
  • 浏览: 110575 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

让C#中的0等于0

阅读更多
引用
作者 Jonathan Allen 译者 王瑜珩 发布于 2009年6月1日 InfoQ


C#对装箱后的值类型支持的并不好。与VB不同,==这样的基本算术比较符无法在装箱后的类型上得到正确的结果,即使所比较的值属于同一类型。

变量 类型 值
a int 0
b decimal 0.0
c decimal 0.0
boxA boxed int 0
boxB boxed decimal 0.0
boxC boxed decimal 0.0
dynA dynamic holding an int 0
dynB dynamic holding a decimal 0.0
dynC dynamic holding a decimal 0.0

比较 C# VB
a==b true true
b==a true true
b==c true true
a.Equals(b) false <--
b.Equals(c) true <--
boxA == boxB false true
boxB == boxA false true
boxB == boxC false true
boxA.Equals(boxB) false <--
boxB.Equals(boxC) true <--
dynA == dynB true n/a
dynB == dynA true n/a
dynB == dynC true n/a


从上表可以看出,在C#3与之前的版本中,即使两个装箱的值都是decimal类型的,得到的也是不相等的结果,但是Decimal类的Equals方法返回的却是true。

幸好在C#4中可以避免这样的问题。你需要将装箱的值都转换为dynamic类型然后再比较,这样即使两个值本来的类型不相同,也可以得到正确的结果。

Console.WriteLine((dynamic)boxA == (dynamic)boxB);
分享到:
评论

相关推荐

    c#中只允许输入大于零的小数和整数

    在C#编程语言中,对用户输入的有效性进行验证是一项重要的任务,特别是在处理数值输入时。这不仅能确保数据的准确性,还能提升应用程序的健壮性和用户体验。本文将深入探讨如何在C#中实现一个功能,该功能仅允许用户...

    c#中结构数组的定义

    ### C#中结构数组的深度解析 #### 一、数组概览 在C#中,数组作为基础数据结构,提供了一种存储同类型元素的连续内存区域的方式。数组的索引从0开始,这一特性与许多其他编程语言相似。值得注意的是,C#中的数组...

    c#汉字乱码处理

    在C#编程中,处理汉字乱码问题是一个常见的需求,尤其是在读取或写入文本文件时。当在C#控制台应用中遇到汉字输出乱码的情况,这通常是因为编码不匹配所导致的。编码是字符集与二进制数据之间的转换规则,不同的系统...

    C# Zebra打印中文 DEMO

    在本文中,我们将深入探讨如何在C#环境中利用COM接口实现Zebra打印机的中文打印功能。这个DEMO项目是基于Visual Studio 2010开发的,为开发者提供了一个直观的示例,来理解如何与Zebra打印机进行交互并打印中文字符...

    C# 0/1背包问题过程演示源码

    它在C#编程中可以通过动态规划来解决。本压缩包包含的"01背包问题过程演示"源码,提供了一个直观的实现示例,旨在帮助初学者理解这一算法。 在0/1背包问题中,我们有一个容量为W的背包,以及n个物品,每个物品有...

    c# 数据组合 从一组数据中 返回组合的和等于某个值 的所有组合

    总结来说,"c# 数据组合 从一组数据中 返回组合的和等于某个值 的所有组合"这个问题可以通过递归和回溯技术在C#中实现。这个过程涉及到组合数学、算法设计以及递归编程,是计算机科学中的基础概念,对于提升编程能力...

    C# 实现中文发音或中文语音识别

    C# 实现中文发音或中文语音识别 在 .NET 中,对英文语音有较好的支持,但是对中文语音的支持还没有加入进来。为了实现中文语音识别,我们需要使用微软的 Speech Application SDK(SASDK),它的最新版本是 SAPI 5.1...

    16位0-F随机数生成器 源代码基于c#

    在IT行业中,编程语言C#是一种广泛使用的面向对象的语言,尤其在Windows平台和.NET框架下。本项目聚焦于一个特定的实用工具——16位0-F随机数生成器,它是用C#编写的。这个工具的主要功能是生成指定数量的16位十六...

    C#中spreadsheet的使用

    ### C#中Spreadsheet的使用详解 在C#开发中,处理Excel文件是非常常见的需求之一。本文档将详细介绍如何在C#中使用Spreadsheet技术来读取、操作和展示Excel文件的内容。 #### 一、环境准备与前置知识 在开始之前...

    c#入门经典 0基础入门经典

    c#入门经典 0基础入门经典 c#入门经典 0基础入门经典 c#入门经典 0基础入门经典 c#入门经典 0基础入门经典

    C#modbus rtu绝对好用,绝对能用.rar_C# ModbusRtu 库_C#Modbus通信_C#modbusrtu_

    本篇文章将深入探讨如何在C#中实现Modbus RTU通信,以及相关的库和编程技巧。 首先,让我们理解什么是Modbus RTU。Modbus是基于串行通信的一种简单、开放的协议,RTU(远程终端单元)模式是其工作方式之一,它通过...

    C#递归 C#递归 C#递归

    根据给定的信息,本文将详细解释C#中的递归概念,并通过具体的代码示例来解析递归函数在构建树形结构中的应用。 ### C#递归基础 #### 什么是递归? 递归是一种编程技术,它允许一个方法或函数直接或间接地调用自身...

    C#中读取sql server的数据,并在datagridview中显示

    在IT领域,尤其是在软件开发与数据库交互中,C#与SQL Server的结合是十分常见的应用场景。本文将深入探讨如何在C#中读取SQL Server的数据,并将其在DataGridView控件中进行展示,以此来实现数据的可视化呈现。此过程...

    c#入门经典,0基础学习

    c#入门经典,0基础学习 c#入门经典,0基础学习 c#入门经典,0基础学习

    c#中如何调用外部DLL

    ### C#中如何调用外部DLL 在C#开发中,有时我们需要调用其他语言编写的库文件(DLL),这通常是为了复用已有代码、利用特定语言的优势或访问某些特定平台的功能(如Win32 API)。本文将详细介绍如何在C#中调用外部...

    C#中DataSet的用法(很详细)

    在C#编程中,DataSet是ADO.NET框架中的一个重要组件,它是内存中数据的容器,能够离线存储和处理数据。DataSet不仅包含多个DataTable,用于存储实际的数据,还提供了丰富的功能,如浏览、排序、搜索、过滤和缓存更改...

    c#中的参数

    在C#编程语言中,虽然主要讨论的是Java的`main`函数及其参数,但我们可以将这些概念与C#进行比较,因为它们之间有很多相似之处。在C#中,程序的入口点也是`Main`方法,而不是`main`,并且它的签名略有不同。 在C#中...

    C#按指定条件在数组中检索元素

    在C#编程语言中,处理数组是常见的任务之一。数组是一种数据结构,它允许我们存储相同类型的数据集合。在实际应用中,我们经常需要在数组中查找满足特定条件的元素,这可以通过各种方法实现。本篇文章将深入探讨如何...

    前端开发C#html中简单实例

    在前端开发领域,C#和HTML常常被结合使用,特别是在ASP.NET框架中,开发者可以利用C#的强大后端处理能力和HTML的用户界面呈现能力来构建动态网页应用。在这个"前端开发C# html中简单实例"中,我们可能涉及到的是如何...

    C#中TCP粘包问题的解决方法

    在TCP/IP通信中,"粘包"问题是一个常见的现象,特别是在C#等编程语言中进行TCP编程时。TCP粘包是指发送方发送的多个数据包在接收方接收时被合并成一个大包,使得接收方无法正确区分各个独立的数据包。这种问题通常是...

Global site tag (gtag.js) - Google Analytics