- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些 PowerShell 代码,我在其中调用一个 .NET 方法,该方法希望将一个类作为参数传递。
该方法接受一个空值作为参数,在 C# 中,您将按如下方式调用它:
var T = New Foo(null)
如果将其转换为 PowerShell,可以尝试:
$T = New-Object Foo($null)
但是返回以下错误
New-Object : Constructor not found. Cannot find an appropriate constructor for type Foo
有趣的是,如果我这样调用它,会返回完全相同的错误:
$T = New-Object Foo
所以第一个问题是为什么? .NET 是否将 $null
视为缺少某物,与 .NET 中的类型 null
相对?这就是上面两条指令返回相同错误的原因吗?
现在,我找到了解决这个问题的方法如下:
$T = New-Object Foo(@($null))
这工作得很好,但是......为什么?
(@($Null)).GetType()
返回 object[]
(@()).GetType()
也返回 object[]
,但如果我运行:
$T = New-Object Foo(@())
我仍然得到:
New-Object : Constructor not found. Cannot find an appropriate constructor for type Foo
那么,第二个问题:@()、@($null) 和 $null 之间有什么区别?
另外,最后一个问题,这是我不明白的另一件事。
假设我有另一个 .NET 方法作为 Bar(string, Foo)
如果我调用:
$B = New-Object Bar("s", $null)
这很好用,无需将其转换为对象[] 或类似的东西。
那么第三个也是最后一个问题是:为什么参数个数会影响是否需要作为数组传递?
我的猜测是,如果我要将它转换成一个数组,我会称它为
$B = New-Object Bar(@("s", $null))
这意味着即使该方法需要两个参数,我只将一个作为对象数组传递给它,然后它会自动将每个数组项映射到参数上,但这仍然不能完全提供答案前两个问题:)
编辑
我知道 @() 是一个空数组,而 @($null) 是一个包含一个恰好为 null 的元素的数组,所以这不是我要问的。
但是,如果调用:
$T = New-Object Foo($null)
使 Foo 的构造函数看不到传递的参数,为什么调用 @()
与调用 @($null)
不同?当然,在这种情况下,@($null)
应该与 @()
相同,因为在 .NET 方法中缺少参数。
为什么 $null
有时有意义,有时却毫无意义?
最佳答案
根据您的编辑,您已经很好地理解了 $null 和 @($null) 之间的区别。
与对 .Net 方法的正常调用不同,调用构造函数需要先调用 New-Object cmdlet。 New-Object 的语法是:
New-Object [-TypeName] <string> [[-ArgumentList] <Object[]>] [-Property <IDictionary>]
让我们想一想 New-Object 是如何工作的。使用反射,New-Object 将调用 TypeName.GetConstructors() 并找到可以接受 n 个参数的候选构造函数,其中 n 是 ArgumentList 中参数的数量。
如果您这样调用 New-Object:
New-Object -TypeName Foo
那么 ArgumentList 的值为 $null。您没有传递 $null,但这就是它的值(value)。如果 ArgumentList 为 $null,则没有参数。在此示例中,很明显,您没有指定 -ArgumentList。如果你写:
New-Object -TypeName Foo -ArgumentList $null
这以相同的最终结果结束——没有参数列表。 ArgumentList 需要一个 [object[]],$null 是 [object[]] 的完全有效值,但这意味着没有参数。
如果你写:
New-Object -TypeName Foo -ArgumentList @($null)
现在您正在传递一个具有单个值的 [object[]],值 $null,并且一切都如您所愿。
这无疑令人困惑,但有助于思考如何实现自己的 C# 函数来调用另一个函数并接受参数数组。如果您的参数数组为空,则您不会收到额外的参数。
在某些情况下,New-Object 可能更加令人困惑。我个人被重载的构造函数绊倒了,一个接受数组,另一个接受多个参数。在 C# 中,构造函数类似于:
Foo(object[] array); // #1
Foo(string s, int i); // #2
我错误地尝试调用构造函数#1:
New-Object -TypeName Foo -ArgumentList @($array)
这会调用构造函数#2,因为 New-Object 总是期望 [object[]] 传递多个参数,而您很少希望使用单个数组参数调用构造函数。正确的 PowerShell 应该是:
New-Object -TypeName Foo -ArgumentList (,$array)
由于这种混淆,我在 PowerShell V5 中添加了一种调用构造函数的新方法。现在可以作为非常早的预览版 ( http://www.microsoft.com/en-us/download/details.aspx?id=42936 ) 使用,语法看起来像静态方法调用:
[Foo]::new($name, $count)
使用这种新语法,调用构造函数不再令人困惑,而且作为附带好处,它也比调用 New-Object 快一个数量级。
编辑:我用重载构造函数更正了示例。
关于.net - @($null) 和 $null 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25360193/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!