Beginning C# Objects从概念到代码——1.10 隐式类型转换和显式类型转换

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

C#支持隐式类型转换。意思是如果我们试图给变量x赋予变量y的值:

x = y;

且这两个变量被声明为不同类型,则C#仍将尝试赋值操作,自动把y的类型转换为x的数据类型,前提是不能损失数据精度。(C#CC++不同的是,后两者即便损失精度也会做自动转换)。举例说明:

  int x;

  double y;

  y = 2.7;

  x = y; // 试图将double值赋给int变量

          // 只在CC++中有效,C#不支持。

这段代码中,我们试图把y的双精度值2.7复制给x,而x是一个整类型变量。假使赋值操作真被执行,则y值的小数部分将被截去,x得到值2。这样就发生了精度损失,或称窄化转换(narrowing conversion)CC++编译器允许这样的赋值,不出一声就把值截;然而,C#编译器不会认为这是我们的真意,而是在最末行产生一个错误。

  error CS0029: Cannot implicitly convertdoubleto typeint

为了明确告诉C#编译器我们愿意接受精度损失,必须进行显式转换,把表达式值转换为括号里的目标类型。

换言之,我们需要重写上例的末行,让C#编译器接受它:

  int x;

  double y;

  y = 2.7;

  x = (int) y;                 // 能够编译。C#编译器“松了口气”。

                                 // 因为我们明确地告诉它,

                                 // 想要进行窄化转换。

当然,如果我们进行反向赋值:

  int x;

  double y;

  x = 2;

  y = x;                        // int值赋给double变量;

                                 //y的值将是2.0

C#编译器不会对末行产生问题,因为在该个案里,我们把较低精度的值——2——赋予了拥有较高精度的变量。这称作宽化转换(widening conversion);这类转换在C#中会自动进行,无需显式转换。

注意,在C#里面给float变量赋值时,有一种特殊情况;语句

float y = 3.5;  // 不会被编译!

将产生一个编译器错误,因为类似3.5这样带有小数部分的数字常量会被C#认为是拥有更高精度的double值,所以编译器将因精度损失而拒绝执行。要进行这样的赋值,必须显式地把浮点常量转换为float值:

float y = (float) 3.5;  // 没问题;进行了转换。

或者,也可以使用后缀F,强制编译器把赋值语句右边的常量看作浮点值:

float y = 3.5F;  // 可以,我们指示了该常量

                    // 应被当作浮点值处理。

还有一种选择是直接使用double变量而不用float变量来表示浮点数。在SRS应用中,无论何时要声明浮点变量,我们都会使用double来代替,这样可以避免类型转换操作。

仅有一种C#简单类型不可转换到另一类型,无论显式或隐式都不行,那就是bool类型。

你将在本书稍后部分看到其他和对象相关的转换。

 
C#——类型转换 类型转换 一、c#类型转换可以分为两大类:一类是同一类型转换(Cast),另一类是不同类型转换(Convert)。 (一)同一类型转换(Cast)可分为两种: (1)隐转换:如果当目标类型一定能满足源类型转换过去后的要求的话就是隐转换。 (2)转换(强制转换):如果当目标类型不一定能满足源类型转换过去后的要求的话就需要转换(程序员自已负责)。 具体解释参考... 阅读详情

相关推荐

C# 试题库知识点,填空题、选择题,判断题,编程题【共940道题】

1、操作符( && )被用来说明两个条件同为真的情况。2、接口只能定义方法,实现要由( 类 )完成。3、任何事物都是(对象),它可以是现实世界中的一个物理对象,可以是抽象的概念或规则。4、( += )运算符将左右操作数相加的结果赋值给左操作数。5、( Array )是所有数组的基类。6、如果一个属性里既有set访问器又有get访问器,那么该属性为( 读写 )属性。7、如果一个属性里只有set 访问器,那么该属性为(  只写 )属性。8、常量通过关键字( const )进行声明。9、在C#中,进行注释有两种

这个人好有趣....hh 1万+

日泽IT笔记系列1-Beginning C# Objects概念代码-1

  《Beginning C# Objects概念代码》 自去年9月份买了这本书,正好一年了,将里面自己认为是重要的话语摘录了下来。同时也庆祝我的第一篇博客日志的诞生。1 A Little Taste of C#.NET Framework是全新的革命性应用开发运行环境管理平台,支持超过20种语言。.NET Framework的核心要素之一是公共语言运行时(CLR),它负责

JIN RIZE's 研一 (1st) 1007

C#隐式类型转换类型转换

C#支持隐式类型转换,但前提是不损失数据精度。而CC++不同的是,即使损失精度也会自动转换。如:int x;    double y;    y=2.7;    x=y;假使赋值操作真被执行,那么y值的小数部分将被截取,x取得值2。这样就发生了精度损失,或称窄化转换。C或C++编译器允许这样的赋值,不出一声就把值给截短;然而,C#编译器会提示错误:error CS0029:Canno

dennis_927的专栏 2397

Beginning C# Objects目录初译稿

(译者按:下面是本书目录的初译稿,大多数术语都加上了英文原文。翻译不是一蹴而就的事,需要经过仔细的推敲才能保证最终译稿的质量。这个初译稿,一定存在不少问题,请大家多提意见。我在下一步的翻译中,会充分考虑您的建议意见。)目录关于作者致谢前言本书简介第一部分 对象ABC第一章 浅尝C#语言上手指南为什么选用C#C#语言初阶剖析一个简单的C#程序预定义类型(Predefined Types)

Beginning C# Objects: from Concepts to Code中文版Blog 2870

Beginning C# Objects翻译缘起

得知我将成为Beginning C# Objects: from Concepts to Code一书的中文版译者时,一位朋友以其亲身体验告诉我,译书是一件苦差,敢于译大部头的书,简直就是“无知者无畏”的冒傻气行为。其实我何尝不知翻译的辛苦呢?在进入IT行业之前,我在外语界活动了整整十年(其中五年是越南语专业学生),其间做笔译、口译无数,基本属于接单能力较强的一类。翻译是破坏,也是创造。破坏一

Beginning C# Objects: from Concepts to Code中文版Blog 2782

Beginning C# Objects概念代码 ——第1章 初尝C#

本书主要介绍了C#语言各方面的知识以及使用C#进行开发的原则与实践,结合C#深入浅出的阐述面向对象理论的基本内容。本书是由该书作者之一Jacquie Barker的经典畅销著作Beginning Java Object一脉传承而来,与之具有异曲同工的特色。 本书最初最重要的关注点,是软件对象:什么是软件对象,为什么它们如此神奇而直白,以及如何正确使用对象去构建一个软件应用。这也是一本关于C#的书

optop的专栏 1152

Beyond Single Language——有感Beginning C# Objects中文版

Beyond Single Language——有感Beginning C# Objects中文版 张  昊        Beginning C# Objects中文版主要介绍了C#语言的知识以及使用C#进行开发的原则与实践,结合C#深入浅出的阐述面向对象理论的基本内容。然而本书不止达到此目的,在我看来它超越了对单一语言的讨论。     编程(Programming)

博文视点市场策划——罗罗的专栏 1251

C#你真的入门了吗?

C#你真的入门了吗?                                 —韩磊、孟言谈面向对象编程如何正确入门    孟言:大家下午好,又是我给大家主持这一期的访谈节目,今天我邀请到大名鼎鼎的韩磊,他一方面是CSDN的运营者,另一方面是著名的技术专家,前不久他翻译了一本书,叫《Beginning C# Objects》,当时我知道的时候很诧异,

emily0516的专栏 784

Beginning ASP.NET 3.5 in C# 2008 From Novice to Professional Second Edition(ASP.NET 3.5(C#2008)入门 )翻译

为了学习而不得已翻译,放到网上自己看着方便,一来可以作为笔记,另外可以得到高手的指正、指点。今天先翻译自己感兴趣的第十章。先发个目录,以后慢慢翻译。目录作者简介 . xxvAbout the Technical Reviewer关于技术评论. xxviiAcknowledgments鸣谢. . xxixIntroduction导言. . xxxi第一部分

seajack的ASP.Net学习笔记 1326

C#你真的入门了吗?(转载于csdn)

孟言:大家下午好,又是我给大家主持这一期的访谈节目,今天我邀请到大名鼎鼎的韩磊,他一方面是CSDN的运营者,另一方面是著名的技术专家,前不久他翻译了一本书,叫《Beginning C# Objects》,当时我知道的时候很诧异,...

cuanquangu7966的博客 141

Beyond Single Language

   代码(Code) 凭空

亮晶晶 854

一本你肯定可以读懂的Java图书

Jacquie Barker的畅销经典著作Beginning Java Objects(第2版)中文版即将出版。作者的链接。代码下载链接。Slashdot上将它与Head First Java进行的比较。非常到位。JavaRanch上的评论。Librenix上的评论。请注意这些评论基本上是针对第1版的。第2版除了更新到Java 5.0之外,内容也更加充实,值得期待!封底文字“如果在我刚开始

书 人 事 1万+

编译器 | 从工业实现到极简设计 —— 编译器的多元形态与实践

……

u013669912的博客 837

UnityReference阅读笔记

UnityCsReference 是 Unity 引擎的 C# 源码仓库,涵盖公开 API、绑定层、编辑器工具及部分托管实现,但不包含核心 C++ 逻辑。其价值在于揭示 C#C++ 的交互机制:通过 extern、FreeFunction 等绑定技术,实现参数封送与跨层调用。

lastXuanGod的博客 180

基于C#开发的ScreenSaver屏保应用 - 开源研究系列文章 - 个人小作品

,然后在泡泡屏保里就说在其基础上集成其它的屏保文件,做成自己屏保小应用,让其它屏保能够得到应用,于是就找了一些屏保,放到了此屏保应用里用于选择,打造自己的屏保管理应用,于是就有了此文。将插件放在应用的PlugIns目录里,运行应用,在设置里选择屏保,等待运行。(就是将屏保文件集成到插件Dll文件里进行调用)这个例子只是抛砖引玉,请需要的读者自己复用代码。上次编写了图片屏保(1) 主应用监控倒计时;

lzhdim的专栏 271

Statements without Semicolons

一条物理行 = 多条语句,完全合法;对比:Python 靠缩进换行区分语句,C# 完全靠分号,这就是 “free-form 语言” 的特征。同样地,有些情况 —— 例如 using 声明 —— 虽然带有分号作为后缀,但它并不是一条语句。例如,代码清单 1.3 在一行里包含两条语句,两者结合,分别在两行中示 Up Down。由于换行并不分隔语句,你可以把多条语句写在同一行,C# 编译器会把这行解释为包含多条指令。实际上,代码块本身也被视为语句(代码块同样由语句组成),而且它们不需要以分号结尾。

龙山大佛爷的博客 200

PDF浏览器(WPF C#

本PDF浏览器基于WPF C#与Vue3、TypeScript、PDF.js开发,支持多标签浏览、缩略图导航、文本高亮批注、页面旋转缩放及双击关联打开。新增15种语言切换、密码管理、历史记录功能,采用无文件落地设计提升安全性。支持明暗主题切换,单实例运行,操作简便。即将发布全功能免费版,持续优化中。

9.歌工作室 274

Keywords

编译器把 class 当成关键字,不是变量名,编译报错。如果关键字使用位置不对,违背语法规则,编译器无法解析代码,就输出编译错误,程序无法生成。这些单词被称为关键字,它们提供具体语法,编译器依靠这套语法来解析程序员编写的表达。如果删掉关键字,编译器就无法分辨代码结构,直接编译报错。关键字不是随便写在代码任意地方的,只能用在语法规定的位置。编译器依靠关键字识别代码结构,分辨哪里是类、哪里是判断语句。注意:issue 在这里不是名词 “问题”,是动词:输出、发出。,就能识别类、静态方法的代码结构。

龙山大佛爷的博客 109

C# WinForm 中 TCP 客户端与服务端开发实战

本文通过一个完整的 WinForm 示例,演示了 C# 中 TCP 服务端与客户端的基本开发流程。服务端使用监听端口,通过接受连接。客户端使用TcpClient主动连接服务端。收发数据统一通过进行读写。后台线程负责接收数据,通过Invoke实现跨线程更新 UI。在此基础上,读者可以进一步扩展多客户端并发处理、消息分包协议、心跳保活、断线重连等功能,构建更健壮的网络应用。

lzcbaba的博客 178
上一篇: Beginning C# Objects从概念到代码——1.8 大小写敏感
下一篇: Beginning C# Objects从概念到代码——1.9 C#表达式
optop
博客等级 码龄22年 8粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值