powershell - 为什么某些 Powershell 类型名称中需要加号运算符?
问题描述
为什么在 Powershell 中,System.DayOfWeek
枚举可以引用 like [System.DayOfWeek]
,而System.Environment.SpecialFolder
枚举必须引用 like [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
嵌套在typeEnvironment
中的Type位于命名空间 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]
for [System.Text.RegularExpressions.Regex]
),从命名空间中省略System.
前缀的能力(例如,[Collections.Generic.List`1[string]]
代替[System.Collections.Generic.List`1[string]]
),并且不必在`1
传递类型参数列表时指定通用参数(例如)(例如[Collections.Generic.List[string]]
,而不是[Collections.Generic.List`1[string]]
- 请参阅此答案)以获取更多信息。
推荐阅读
- python - 选择“实体”,其中只有几组另一个特征(另一列)
- c++ - 名称中带有空格的临时类型的统一初始化的正确语法,如 unsigned int
- javascript - 如何在渲染前设置父状态?
- java - 在 Junit 或 Groovy/Spock 测试中测试匿名类
- azure-devops - “下载管道工件”与“下载构建工件”
- azure - Luis.ai 迁移错误“端点密钥已由协作者分配给您的应用程序,您无权访问它们。”
- python - 我似乎无法使用 pygame 打开图像
- php - 具有两个 where 情况的查询表
- java - 如何将这个简单的 java 代码变成一个 while 循环,并且可以选择结束程序或重新启动?
- rust - 返回引用当前函数拥有的数据的值