当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 转换

作者:精品下载站 日期: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。
  • 否则,行为是由实现定义的。

始终允许转换,但不会更改值的类型。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯