char[] 和 char 有什么区别?

Nik*_*son 4 powershell

如果我使用[char]数据类型,它要求值是一个字符,例如

[char]"a"
a
Run Code Online (Sandbox Code Playgroud)

因为如果我将它与多个字符一起使用,它会给我一个错误:

[char]"ab"
Cannot convert value "ab" to type "System.Char". Error: "String must be exactly one
character long."
At line:1 char:1
+ [char]"ab"
+ ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastParseTargetInvocation
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用

[char[]]"ab"
Run Code Online (Sandbox Code Playgroud)

我得到输出

a
b
Run Code Online (Sandbox Code Playgroud)

如果我比较Get-Member两者,我不会得到任何结果:

PS C:\Users\nijoh> Compare-Object -ReferenceObject $([char] | gm) -DifferenceObject $([char[]] | gm) -PassThru
PS C:\Users\nijoh>
Run Code Online (Sandbox Code Playgroud)

但我可以看到它们是两种不同的类型,因为它们的显示方式不同:

PS C:\Users\nijoh> ([char[]]"a").GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Char[]                                   System.Array


PS C:\Users\nijoh> ([char]"a").GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Char                                     System.ValueType
Run Code Online (Sandbox Code Playgroud)

那么Powershell中的数据类型[char][char[]]数据类型有什么区别呢?

mkl*_*nt0 6

在 PowerShell 中,包含在 中的类型名称[...]类型文字,即表示所命名的 .NET 类型的对象。

与此无关,inside [...][] 紧跟在类型名称之后表示包含该类型元素的数组;有关内部使用的符号的概述[...],请参阅此答案

所以:

  • [char]指类型System.CharSystem.前缀在 PowerShell 中通常是可选的;另外 - 就像这里的情况一样 - PowerShell 有一组固定的类型加速器,允许您对位于任何命名空间中的类型使用简单的名称- 请参阅此答案)。

    • 要获取给定类型文字的完整(命名空间限定).NET 类型名称,请使用[...].FullName; 例如,[char].FullName产量System.Char
  • [char[]]指的是一个数组类型,其元素类型为char( System.Char);[char[]].FullName产量System.Char[]


因为如果我将它与多个字符一起使用,它会给我一个错误 ( [char]"ab")

PowerShell 没有[char]文字,只有字符串( [string]) 文字。当您将字符串转换[char]- 代表单个字符时 - 仅接受单字符字符串;例如[char] 'a'工作,但[char] 'ab'[char] "ab"没有。

但是,如果我使用[char[]]"ab"...

铸造一个字符串的数组的字符返回包含该字符串的各个字符的字符数组。

换句话说:[char[]] "ab"等价于"ab".ToCharArray()

如果我比较Get-Member两者,我不会得到任何结果:

其原因是,Get-Member在工作类型的输入对象的,并且如果输入对象是类型文字-诸如[char][char[]]-它们的类型进行检查,这是System.RuntimeType,非公共的PowerShell类型,从导出System.Reflection.TypeInfo,其描述了.NET类型.

换句话说:所有类型文字Get-Member将导致相同的输出,无论它们引用什么特定类型,因为它是唯一一个其成员被报告的类型描述类型。

因此,可以预见,Compare-ObjectGet-Member具有不同类型文字的调用上使用不会产生任何输出,因为Get-Member调用会产生相同的输出[1]。(不产生输出是Compare-Object表示未检测到差异的方式。)


[1]Get-Member输出一个Microsoft.PowerShell.Commands.MemberDefinition实例数组,一个用于输入对象类型的每个成员。在没有-Property传递给的参数的情况下Compare-Object,这些实例作为一个整体通过它们的.ToString()值进行比较,从而产生每个成员的有意义的表示。


归档时间:

查看次数:

94 次

最近记录:

5 年,8 月 前