2

我犯了一个错误。我在数组值之间使用了句号而不是逗号。$x 是什么?它似乎是 $null。这个表达是什么意思?为什么没有错误信息?

PS 18:48  C:\src\t
>$x = 1.2.3
PS 18:48  C:\src\t
>$x
PS 18:48  C:\src\t
>$x.GetType()
You cannot call a method on a null-valued expression.
At line:1 char:1
+ $x.GetType()
+ ~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

PS 18:48  C:\src\t
>$null -eq $x
True
PS 18:48  C:\src\t
>$x.Count
0
4

2 回答 2

3

1.2 隐含为双精度类型。第二 ”。” 尝试从 double 调用成员(属性或方法),因为没有名为“3”的 double 的成员,$x 变为 $null。

于 2019-09-28T00:26:07.017 回答
3

为了补充Paul G 的有用答案,其中解释了.3in1.2.3被解释为访问以解析为3[double]值命名的属性1.2

为什么没有错误信息?

默认情况下,PowerShell会忽略访问对象上不存在的属性的尝试并返回$null.

但是,如果您使用Set-StrictMode -Version 2或更高版本,则会发生语句终止错误:

PS> Set-StrictMode -Version 2; 1.2.3
The property '3' cannot be found on this object. Verify that the property exists.
...

有关详细信息,请参阅Set-StrictMode帮助主题

虽然Set-StrictMode对于防止变量和属性名称拼写错误等错误很有用,但它也有明显的缺陷:

  • Set-StrictMode是动态的而不是词法范围的,这意味着从它有效的范围调用的所有代码也会受到影响 - 并且此类代码可能不是为此而设计的,因此会中断;提供一个词法范围的严格模式来解决这个 RFC的主题。

  • 使用Set-StrictMode -Version 2或更高版本时,统一 PowerShell 处理标量和集合的隐式添加.Count的属性将不可用 - 这应该被视为一个错误,并已在此 GitHub 问题中报告。

于 2019-09-28T03:21:35.833 回答