【问题标题】:New-Object -Property Hashtable not populating fields in Version 5.0 on Win 10New-Object -Property Hashtable 未填充 Win 10 版本 5.0 中的字段
【发布时间】:2015-07-16 15:12:49
【问题描述】:

以下代码在 PowerShell 4.0 及更早版本中运行良好。如果我在最新的 Windows 10 版本的 5.0.10240.16384 版本上运行它,则字段不会填充到新对象 ($a) 中。这是一个错误还是发生了什么变化?

Add-Type @"
   public struct TestUser {
    public string First;
    public string Last;
}
"@;

$a = New-Object TestUser -Property @{ First = "Joe"
                                Last = "Smith"};

4.0 及更早版本的结果:

$a.First -eq "Joe"
$a.Last -eq "Smith"

5.0 版

$a.First -eq $null
$a.Last -eq $null

版本 5 获取成员

TypeName: TestUser

Name        MemberType Definition                    
 ----        ---------- ----------                    
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()             
GetType     Method     type GetType()                
ToString    Method     string ToString()             
First       Property   string First {get;set;}       
Last        Property   string Last {get;set;}      

编辑: 我已经向 Microsoft 提交了一个与此相关的错误,因为这是一个会影响许多现有脚本的重大更改(如果是更改)。如果该错误报告有任何更新,我将更新此问题。如果有人在 v5 中遇到可能表明这是所需/更改的行为的内容,我仍在寻找任何反馈。如果有人好奇并且无法访问 Win 10 机器,也很高兴尝试在 v5 上进行其他测试。

https://connect.microsoft.com/PowerShell/feedbackdetail/view/1552941/new-object-property-hashtable-not-populating-fields-in-version-5-0-on-win-10

【问题讨论】:

  • 在 v5 中,属性是否存在并且为 null 或未创建属性。它们等于 null 并没有指定是哪种情况。使用$a | gm查看
  • @Matt 我承认不清楚,$a | Get-Member 确实显示属性存在。它们的值只是空的。 Get-Member 确实显示了正确的类型 (TestUser) 以及所有预期的属性和方法。

标签: powershell powershell-5.0


【解决方案1】:

我已从 PowerShell 团队成员那里得到验证,这是一个与缺少“拆箱”调用有关的错误。现在的解决方法是尽可能使用类而不是结构。有人提到 struct 在 PowerShell 中几乎没有什么好处,因为 PowerShell 总是将一个 struct 装箱。

【讨论】:

  • 确认是这种情况。感谢 Keith 的跟进!
  • 作为后续,Microsoft 已在 PowerShell 5.0.10586 中修复了此错误。
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 2022-11-26
  • 2021-05-06
  • 2013-06-09
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多