gpt4 book ai didi

arrays - PowerShell 中是否提供联合类型

转载 作者:行者123 更新时间:2023-12-05 01:28:31 26 4
gpt4 key购买 nike

$arrIntOnly = [Int[]]@(1, 2, 3) 这样的类型化数组对于确保所有元素都是有效类型很有用,但是是否可以定义多个类型,例如 $arrIntOrString = [[Int | String][]]@(1, "二", 3)?

最佳答案

PowerShell 没有联合数据类型,但您可以使用 PowerShell 的默认数组,它们是[object[]]类型的因此可以包含任何类型的元素:

# Note: @(...) around the array isn't strictly necessary.
$arrIntOrString = 1, 'two', 3

没有直接的方法限制允许哪些特定类型。

但是,您可以使用类型为 System.Management.Automation.ValidateScriptAttribute验证属性在这种情况下 - 强制将元素限制为指定类型:

[ValidateScript({ $_ -is [int] -or $_ -is [string] })] $arrIntOrString = 1, 'two', 3

以上将在初始赋值和以后的修改中强制执行指定的类型;例如,以下尝试稍后“添加”[1] 一个不允许类型的元素将失败:

# FAILS, because $true (of type [bool]) is neither an [int] nor [string]
$arrIntOrString += $true

不幸的是,错误消息有些模糊:MetadataError:无法验证变量,因为值 System.Object[] 不是 arrIntOrString 变量的有效值。

请注意,此验证相当缓慢,因为必须为每个元素执行脚本 block ({ ... }) .


您还可以将此技术应用于参数声明,在PowerShell (Core) 7+ 中 允许您定义自定义错误消息:

Function Foo {
param(
# Note: Use of ErrorMessage requires PS 7+
[ValidateScript({ $_ -is [int] -or $_ -is [string] }, ErrorMessage = 'Please pass an integer or a string.')]
$IntOrString
)
$IntOrString
}

Foo -IntOrString 1.0 # Fails validation

[1] 数组是固定长度的数据结构,因此当您使用 +=“添加”到数组时,PowerShell 所做的是创建一个 幕后数组,附加了新元素。数组的有效可扩展替代品是非泛型 System.Collections.ArrayList类型(例如,[System.Collections.ArrayList] (1, 'two', 3))和通用 System.Collections.Generic.List`1类型(例如,[System.Collections.Generic.List[object]] (1, 'two', 3))。然后使用.Add()方法添加到这些集合中;请注意,ArrayList.Add() 方法返回一个值,您可以使用 $null = ... 抑制该值。要初始化任一类型的 集合,请将@() 转换为类型文字或调用其静态::new() 方法。

关于arrays - PowerShell 中是否提供联合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68463190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com