New-Object -属性 Hashtable 不填充 Win 10 版本 5.0 中的字段
New-Object -Property Hashtable not populating fields in Version 5.0 on Win 10
以下代码在 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 中的某些内容提出 运行 可能表明这是 desired/changed 行为,我仍在寻找任何反馈。如果有人好奇并且无法访问 Win 10 机器,也很高兴在 v5 上尝试其他测试。
我已经从 PowerShell 团队成员那里得到验证,这是一个与缺少 "unbox" 调用相关的错误。现在的解决方法是尽可能使用 class 而不是结构。有人提到 struct 在 PowerShell 中几乎没有什么好处,因为 PowerShell 总是会封装一个结构。
以下代码在 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 中的某些内容提出 运行 可能表明这是 desired/changed 行为,我仍在寻找任何反馈。如果有人好奇并且无法访问 Win 10 机器,也很高兴在 v5 上尝试其他测试。
我已经从 PowerShell 团队成员那里得到验证,这是一个与缺少 "unbox" 调用相关的错误。现在的解决方法是尽可能使用 class 而不是结构。有人提到 struct 在 PowerShell 中几乎没有什么好处,因为 PowerShell 总是会封装一个结构。