[玩转系统] 转换
作者:精品下载站 日期:2024-12-14 02:56:06 浏览:13 分类:玩电脑
转换
当在需要不同类型的上下文中使用一种类型的值时,就会执行类型转换。如果这样的转换自动发生,则称为隐式转换。 (一个常见的例子是某些运算符需要转换其操作数指定的一个或多个值。)如果保留源值的含义,则允许隐式转换,例如在以下情况下不会损失数字的精度:它被转换了。
强制转换运算符(第 7.2.9 节)允许显式转换。
下面讨论转换,并在第 6.19 节中每个运算符的描述中根据需要提供补充信息。
将值显式转换为其已有的类型不会导致该值或其表示形式发生更改。
§6.17 中介绍了当表达式的值绑定到参数时处理转换的规则。
6.1 转换为无效
任何类型的值都可以通过将其转换为 void 类型来显式丢弃。没有结果。
6.2 转换为布尔值
将任意值转换为bool类型的规则如下:
- 数值或字符值零将转换为 False;非零的数字或字符值将转换为 True。
- null 类型的值将转换为 False。
- 长度为0的字符串转换为False;长度 > 0 的字符串将转换为 True。
- 值为
$true
的开关参数将转换为 True,值为$false
的开关参数将转换为 False。 - 所有其他非空引用类型值都将转换为 True。
如果该类型实现了 IList:
- 如果对象的长度 > 2,则该值将转换为 True。
- 如果对象的 Length 为 1 并且第一个元素本身不是 IList,则如果该元素的值为 true,则该值将转换为 True。
- 否则,如果第一个元素的 Count >= 1,则该值将转换为 True。
- 否则,该值将转换为 False。
6.3 转换为字符
将任意值转换为 char 类型的规则如下:
- bool、decimal、float 或 double 类型值的转换是错误的。
- null 类型的值将转换为 null (U+0000) 字符。
- 其值可以用 char 类型表示的整数类型值具有该值;否则转换错误。
- 长度不是 1 的字符串值的转换是错误的。
- 长度为 1 的字符串值将转换为具有该一个字符值的 char。
- 任何小数部分舍入后的值可以用目标类型表示的数字类型值具有该舍入值;否则转换错误。
- 对于其他引用类型值,如果引用类型支持此类转换,则使用该转换;否则转换错误。
6.4 转换为整数
将任意值转换为 byte、int 或 long 类型的规则如下:
- 布尔值False被转换为零;布尔值 True 转换为 1。
- 其值可以用目标类型表示的 char 类型值具有该值;否则转换错误。
- 任何小数部分舍入后的值可以用目标类型表示的数字类型值具有该舍入值;否则转换错误。
- null 类型的值将转换为零。
- 表示数字的字符串按照第 6.16 节中所述进行转换。如果截断小数部分后结果可以用目标类型表示,则字符串格式良好并且具有目标类型;否则转换错误。如果字符串不代表数字,则转换错误。
- 对于其他引用类型值,如果引用类型支持此类转换,则使用该转换;否则转换错误。
6.5 转换为 float 和 double
将任何值转换为 float 或 double 类型的规则如下:
- 布尔值False被转换为零;布尔值 True 转换为 1。
- 精确表示 char 值。
- 如果可能的话,精确地表示数字类型值;但是,对于 int、long 和decimal 到 float 的转换,以及long 和decimal 到double 的转换,整数值的一些最低有效位可能会丢失。
- null 类型的值将转换为零。
- 表示数字的字符串按照第 6.16 节中的描述进行转换;否则转换错误。
- 对于其他引用类型值,如果引用类型支持此类转换,则使用该转换;否则转换错误。
6.6 转换为十进制
将任意值转换为十进制类型的规则如下:
- 布尔值False被转换为零;布尔值 True 转换为 1。
- char 类型值被精确表示。
- 数字类型值被精确表示;但是,如果该值太大或太小而无法适合目标类型,则转换会出错。
- null 类型的值将转换为零。
- 表示数字的字符串按照第 6.16 节中的描述进行转换;否则转换错误。
- 对于其他引用类型值,如果引用类型支持此类转换,则使用该转换;否则转换错误。
- 成功转换结果的小数位数使得小数部分没有尾随零。
6.7 转换为对象
除了空类型(4.1.2)之外的任何类型的值都可以转换为类型对象。该值保留其类型和表示形式。
6.8 转换为字符串
将任意值转换为字符串类型的规则如下:
- 布尔值
$false
被转换为“False”;布尔值$true
转换为“True”。 - char 类型值将转换为包含该 char 的 1 个字符的字符串。
- 数字类型值被转换为具有相应数字文字形式的字符串。但是,结果没有前导或尾随空格,没有前导加号,整数以 10 为基数,并且没有类型后缀。对于十进制转换,保留小数位。对于 -∞、+∞ 和 NaN 值,生成的字符串分别为“-Infinity”、“Infinity”和“NaN”。
- null 类型的值将转换为空字符串。
- 对于一维数组,结果是一个字符串,包含该数组中每个元素的值(从头到尾),转换为字符串,元素由当前输出字段分隔符分隔(第 2.3.2.2 节)。对于元素本身就是数组的数组,仅转换顶级元素。用于表示数组元素值的字符串是实现定义的。对于多维数组,它会被展平(第 9.12 节),然后被视为一维数组。
- null 类型的值将转换为空字符串。
- 脚本块类型值将转换为包含该块文本的字符串,不带分隔符 { 和 } 。
- 对于枚举类型值,结果是一个字符串,其中包含该值中编码的每个枚举常量的名称,并以逗号分隔。
- 对于其他引用类型值,如果引用类型支持此类转换,则使用该转换;否则转换错误。
用于表示数组元素值的字符串具有 System.type[]
、System.type[,]
等形式。对于其他引用类型,将调用方法ToString
。对于其他可枚举类型,源值被视为一维数组。
6.9 转换为数组
将任意值转换为数组类型的规则如下:
- 目标类型可能不是多维数组。
- null 类型的值按原样保留。
- 对于
$null
之外的标量值或 hashtable 类型的值,将创建一个新的 1 元素数组,其值为转换为目标元素类型后的标量。 - 对于一维数组值,将创建目标类型的新数组,并通过从源数组到目标数组中相应元素的转换来复制每个元素。
- 对于多维数组值,该数组首先被展平(第 9.12 节),然后被视为一维数组值。
- 字符串值转换为具有相同长度的 char 数组,字符串中的连续字符占据数组中的相应位置。
对于其他可枚举类型,将创建一个新的 1 元素数组,其值是转换为目标元素类型后的相应元素(如果存在此类转换)。否则,转换就会出错。
6.10 转换为xml
该对象被转换为字符串类型,然后转换为 xml
类型的 XML 文档对象。
6.11 转换为正则表达式
指定字符串类型值的表达式可以转换为regex
类型。
6.12 转换为脚本块
将任意值转换为 scriptblock
类型的规则如下:
- 字符串值被视为命令的名称,可选地后跟调用该命令的参数。
6.13 转换为枚举类型
将任意值转换为枚举类型的规则如下:
- 包含枚举类型的命名值之一(区分大小写)的字符串类型值将转换为该命名值。
- 包含枚举类型的以逗号分隔的命名值(考虑大小写)列表的字符串类型值将转换为所有这些命名值的按位或。
6.14 转换为其他引用类型
将任何值转换为除数组类型或字符串之外的引用类型的规则如下:
- null 类型的值按原样保留。
- 否则,行为是由实现定义的。
许多机器在这里发挥作用;这些包括可能使用单参数构造函数或默认构造函数(如果值是哈希表)、隐式和显式转换运算符以及目标类型的 Parse 方法;使用Convert.ConvertTo;以及ETS转换机制。
6.15 常用算术转换
如果两个操作数都没有指定数值类型的值,则
- 如果左操作数指定 bool 类型的值,则转换出错。
- 否则,指定值
$null
的所有操作数都将转换为 int 类型的零,并且该过程继续进行下面列出的数字转换。 - 否则,如果左操作数指定 char 类型的值,右操作数指定 bool 类型的值,则转换将出错。
- 否则,如果左操作数指定字符串类型的值但不表示数字(第 6.16 节),则转换会出错。
- 否则,如果右操作数指定字符串类型的值但不表示数字(第 6.16 节),则转换会出错。
- 否则,指定字符串类型值的所有操作数都将转换为数字(第 6.16 节),并且该过程继续进行下面列出的数字转换。
- 否则,转换就会出错。
数字转换:
- 如果一个操作数指定十进制类型的值,则另一操作数指定的值将转换为该类型(如有必要)。结果的类型为小数。
- 否则,如果一个操作数指定 double 类型的值,则如有必要,另一操作数指定的值将转换为该类型。结果的类型为 double。
- 否则,如果一个操作数指定 float 类型的值,则两个操作数指定的值将在必要时转换为 double 类型。结果的类型为 double。
- 否则,如果一个操作数指定 long 类型的值,则如有必要,另一操作数指定的值将转换为该类型。结果的类型首先位于可以表示其值的 long 和 double 序列中。
- 否则,如有必要,两个操作数指定的值都会转换为 int 类型。结果具有序列 int、long、double 中的第一个可以表示其值而无需截断的值。
6.16 字符串到数字类型的转换
根据其内容,字符串可以显式或隐式转换为数值。具体来说,
- 空字符串将转换为值零。
- 前导和尾随空格被忽略;但是,字符串可能不仅仅由空格组成。
- 仅包含空格和/或行终止符的字符串将转换为值零。
- 允许有一个前导 + 或 - 符号。
- 整数可以有十六进制前缀(0x 或 0X)。
- 允许使用可选的有符号指数。
- 不允许使用类型后缀和乘数。
- 区分大小写的字符串“-Infinity”、“Infinity”和“NaN”分别被识别为值 -∞、+∞ 和 NaN。
6.17 参数绑定时的转换
有关参数绑定的信息,请参阅第 8.14 节。
当表达式的值绑定到参数时,需要考虑额外的转换注意事项,如下所述:
- 如果参数类型为 switch(第 4.2.5 节、第 8.10.5 节)并且参数没有实参,则被调用命令中的参数值将设置为
$true
。如果参数类型不是 switch,则没有参数的参数是错误的。 - 如果参数类型为 switch 并且参数值为
$null
,则参数值设置为$false
。 - 如果参数类型是对象或者与实参的类型相同,则传递实参的值而不进行转换。
- 如果参数类型不是对象或脚本块,则会评估类型为脚本块的参数,并将其结果作为参数的值传递。 (这称为延迟脚本块绑定。)如果参数类型是对象或脚本块,则按原样传递具有脚本块类型的参数。
- 如果参数类型是 T2 类型的集合,并且实参是 T1 类型的标量,则该标量将转换为包含一个元素的 T2 类型的集合。如有必要,可使用本节的转换规则将标量值转换为类型 T2。
- 如果参数类型是对象以外的标量类型,并且参数是集合,则参数错误。
- 如果预期参数类型是 T2 类型的集合,并且实参是 T1 类型的集合,则实参将转换为与实参集合长度相同的 T2 类型集合。如有必要,可使用本节的转换规则将参数集合元素值转换为类型 T2。
- 如果上述步骤和本章前面指定的转换还不够,则应用第 6.18 节中的规则。如果这些失败,则参数绑定失败。
6.18 .NET 转换
对于隐式转换,首先尝试 PowerShell 的内置转换。如果无法解决转换问题,则会按从上到下的顺序尝试下面的 .NET 自定义转换器。如果找到转换,但抛出异常,则转换失败。
PSTypeConverter:有两种方法将 PSTypeConverter 类的实现与其目标类关联起来:通过类型配置文件 (types.ps1xml) 或应用
目标类的 System.ComponentModel.TypeConverterAttribute
属性。有关更多信息,请参阅 PowerShell SDK 文档。TypeConverter:此 CLR 类型提供了将值类型转换为其他类型以及访问标准值和子属性的统一方法。最常见的转换器类型是在文本表示形式之间进行转换的转换器。类的类型转换器通过 System.ComponentModel.TypeConverterAttribute 绑定到该类。除非覆盖此属性,否则从此类继承的所有类都使用与基类相同的类型转换器。有关详细信息,请参阅 PowerShell SDK 和 Microsoft .NET 框架文档。
解析方法:如果源类型是字符串并且目标类型具有名为
Parse
的方法,则调用该方法来执行转换。构造函数:如果目标类型有一个构造函数采用单个参数,且其类型是源类型的类型,则调用该构造函数来执行转换。
隐式转换运算符:如果源类型具有转换为目标类型的隐式转换运算符,则会调用该运算符来执行转换。
显式转换运算符:如果源类型具有转换为目标类型的显式转换运算符,则会调用该运算符来执行转换。如果目标类型具有从源类型进行转换的显式强制转换运算符,则会调用该运算符来执行转换。
IConvertable:调用
System.Convert.ChangeType
来执行转换。
6.19 转换为有序
将任意值转换为有序伪类型的规则如下:
- 如果该值是哈希文字(第 2.3.5.6 节),则结果是一个具有实现定义类型的对象,其行为类似于哈希表,并且键的顺序与哈希文字中指定的顺序匹配。
- 否则,行为是由实现定义的。
只有哈希文字(第 2.3.5.6 节)可以转换为有序的。结果是 System.Collections.Specialized.OrderedDictionary 的实例。
6.20 转换为 pscustomobject
将任意值转换为伪类型 pscustomobject 的规则如下:
- 哈希表类型的值将转换为 PowerShell 对象。哈希表中的每个键都成为具有相应值的 NoteProperty。
- 否则,行为是由实现定义的。
始终允许转换,但不会更改值的类型。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag