在Powershell中生成.NET数组类型



我正在尝试制作System.Memory[char]

[System.Memory[char]]::Memory([char],0,10)*表示找不到System.Memory类型。

也尝试过*

[System.Memory`3+[[char],0,10]]@()

解决方案:问题似乎是Powershell使用的.NET版本。

是PowerShell v5中引入的静态方法::new()提供了对类型的构造函数的访问[1]

# Initialize a [System.Memory[char]] instance with 10 NUL (0x0) chars,
# from a [char[]] array.
[System.Memory[char]]::new(
[char[]]::new(10)
)

注意:两个System.Memory`1构造函数都需要一个[char[]]数组作为参数。三参数重载中的两个附加参数startlength必须引用该数组中的一系列元素。

上面简单地创建了一个10元素数组(隐式使用NUL字符(,从而无需额外的参数。

如果您希望输入数组使用NUL以外的给定字符,则可以使用类似, [char] 'x' * 10:
, [char] 'x'的方法创建一个带有char的单元素数组。'x',然后* 10对其进行复制以返回10元素的阵列。请注意,数组将是[object[]]类型的,而不是[char[]]类型的,但它仍然可以工作。


注:

  • [System.Memory[char]]@()不起作用,因为PowerShell要将此强制转换转换为单参数构造函数调用,操作数必须是[char[]]数组:

    • [System.Memory[char]] [char[]] @()
  • 从根本上讲,System.Memory`1类型仅在.NET核心2.1+/.NET5+中可用。

    • 检查该类型在PowerShell会话中是否可用的最简单方法是[bool] $IsCoreClr是否返回$true-换句话说:您需要运行PowerShell(Core(7+,这是PowerShell的现代、跨平台、按需安装版

[1]在早期的PowerShell版本中,您需要使用New-Objectcmdlet,它使用参数(-解析(模式,就像所有cmdlet一样。因此,它的语法不能干净地映射到方法/构造函数调用中熟悉的表达式模式语法上,尤其是在传递单个参数时,该参数是数组,如本例所示:
New-Object System.Memory[char] -ArgumentList (, (New-Object char[] 10))
请注意,需要将, [char] 0) * 10构建的数组封装在另一个数组中,即使New-Object将原始数组视为目标构造函数的单个参数所需的临时数组。
此外,::new()表现更好,尽管这通常无关紧要。有关详细信息,请参阅此答案

最新更新