繁体   English   中英

PowerShell:`New-Object` `-ArgumentList` vs 调用构造函数 vs 类型转换

[英]PowerShell: `New-Object` `-ArgumentList` vs calling constructor vs type casting

我刚刚开始学习 PowerShell 的一些基础知识,无法理解New-Object和类型转换。 例如这个:

# all of these yield the same
New-Object System.Net.Sockets.TcpListener -ArgumentList 5000
New-Object System.Net.Sockets.TcpListener(5000)
[System.Net.Sockets.TcpListener]500  # this works

# all of these yield the same
New-Object -TypeName System.Net.Sockets.TCPClient -ArgumentList "8.8.8.8", 53
New-Object System.Net.Sockets.TCPClient("8.8.8.8", 53)
[System.Net.Sockets.TCPClient]::New("8.8.8.8", 53)
# but this doesn't work
# [System.Net.Sockets.TCPClient]("8.8.8.8", 53) # does not work
  • 使用-ArgumentList和使用(arg1,...)什么区别? 是不是类型的名称和(arg1,...)被解释为New-Object两个不同参数,即使它们之间没有空格,因此(arg1,...)被分配为-ArgumentList值?
  • 为什么对System.Net.Sockets.TCPClient的第二个示例进行转换不起作用? 我看到的唯一区别是它需要多个参数,而System.Net.Sockets.TcpListener需要一个参数。 但是为什么 PowerShell 可以通过调用其构造函数将整数转换为System.Net.Sockets.TcpListener而不能将数组转换为System.Net.Sockets.TCPClient呢? 即为什么这两个不等价:
    • [System.Net.Sockets.TCPClient]::New("8.8.8.8", 53) # works
    • [System.Net.Sockets.TCPClient]("8.8.8.8", 53) # does not work

使用-ArgumentList和使用(arg1, ...)什么区别?

  • 不要使用(arg1,...)它是仅碰巧有效的方法语法 - 请参阅此答案的底部部分。

  • 相反,使用arg1, ... - 没有括号,列表前有空格; 这是位置隐含的等价物-ArgumentList arg1, ... (或-Args arg1, ...

为什么对System.Net.Sockets.TCPClient的第二个示例进行转换不起作用?

铸造仅适用于两种变体:

  • 使用与单参数构造函数匹配的标量,或者在string的情况下,如果目标类型具有静态.Parse()方法。

  • 使用哈希表( @{ ... } ),其条目的键匹配目标类型的属性,假设目标类型具有无参数公共构造函数。

因此,您不能从值数组中进行转换。

有关更多信息,请参阅此答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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