[英]Why is a plus operator required in some Powershell type names?
为什么在 Powershell 中System.DayOfWeek
枚举可以像[System.DayOfWeek]
一样引用,而System.Environment.SpecialFolder
枚举必须像[System.Environment+SpecialFolder]
一样引用(注意加号) ?
我的猜测是因为 SpecialFolder 是静态 Environment 类的一部分,而 DayOfWeek 直接位于 System 命名空间中,但我无法找到有关此的任何信息。 通常静态成员会使用“静态成员运算符”,但这在这种情况下不起作用,除了神秘的加号字符外,我也没有尝试其他任何东西......
[System.DayOfWeek] # returns enum type
[enum]::GetValues([System.DayOfWeek]) # returns enum values
[enum]::GetValues([System.Environment.SpecialFolder]) # exception: unable to find type
[enum]::GetValues([System.Environment]::SpecialFolder) # exception: value cannot be null
[enum]::GetValues([System.Environment+SpecialFolder]) # returns enum values
System.Environment.SpecialFolder 绝对是一种类型,在 C# 中两个枚举的工作方式相同:
Enum.GetValues(typeof(System.Environment.SpecialFolder)) // works fine
Enum.GetValues(typeof(System.DayOfWeek)) // also works
我真的很想了解为什么 Powershell 存在差异以及这种行为背后的原因。 有谁知道为什么会这样?
System.Environment.SpecialFolder
绝对是一种类型
类型SpecialFolder
嵌套在类型Environment
,位于命名空间System
:
C#引用该类型作为引用段落中的完整类型名称; 也就是说,它使用.
不仅要将命名空间与包含类型的名称分开,还要将后者与其嵌套类型的名称分开。
相比之下, PowerShell 使用 .NET反射方法Type.GetType()
在运行时获取对该类型的引用:
该方法使用与语言无关的符号来标识类型,如文档主题指定完全限定的类型名称中所述。 向PetSerAl 致敬。
在该表示法中, +
用于将嵌套类型与其包含类型分开(不是.
,如在 C# 中)。
即,PowerShell类型文字( [...]
),例如:
[System.Environment+SpecialFolder]
实际上与获取[
和]
之间的内容相同, System.Environment+SpecialFolder
,并将其作为字符串参数传递给Type.GetType
,即(以PowerShell语法表示):
[Type]::GetType('System.Environment+SpecialFolder')
请注意, PowerShell 为 .NET 的与语言无关的类型符号提供了方便的扩展(简化) ,特别是使用 PowerShell 的类型加速器(例如[regex]
用于[System.Text.RegularExpressions.Regex]
)的能力,以及省略System.
的能力System.
前缀从命名空间(例如[Collections.Generic.List`1[string]]
代替[System.Collections.Generic.List`1[string]]
),和不具有指定的通用元数(例如`1
当传递类型参数列表(例如[Collections.Generic.List[string]]
而不是[Collections.Generic.List`1[string]]
- 请参阅此答案)了解更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.