繁体   English   中英

为什么在某些 Powershell 类型名称中需要加号运算符?

[英]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()在运行时获取对该类型的引用:

即,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM