【发布时间】:2016-12-21 20:28:51
【问题描述】:
在 PowerShell 中,可以定义 C# 代码并执行它。将 $null 传递给以下最简单的函数表明非 null 被传递给函数
Add-Type -TypeDefinition @"
public static class foo
{
public static void fooo(string a)
{
if(a!=null)
{
System.Console.WriteLine("Not Null. Is '" + a + "'");
}
}
}
"@ -Language CSharp
如下调用它会导致输出 Not Null。是 ''。这表明 $null 在 C# 中不为空。 'IsNullOrEmpty' 或 'IsNullOrWhiteSpace' 等方法返回 true,因此 PowerShell 必须已将 $null 隐式转换为字符串。
[foo]::fooo($Null)
任何想法为什么会发生这种情况以及除了在 C# 中调用 String.IsNullOrEnpty 之外是否有更好的解决方法? 注意:无论指定“Add_Type”的 C# 语言如何,都会发生这种情况。我正在使用 PowerShell V5。
【问题讨论】:
-
[foo]::fooo([String] $null)、[foo]::fooo($null -as [String])和$s = $null; [foo]::fooo($s)都产生相同的结果。如果参数a的类型从string更改为object,则fooo不再打印任何输出。这表明 PowerShell 在处理string参数时试图变得“聪明”。 -
使用 PowerShell 5.0 (
class foo { static fooo([String] $a) { if ($a -ne $null) { [Console]::WriteLine("Not Null. Is '" + $a + "'"); } } }; [foo]::fooo($null);) 中的新类支持以及普通的旧 PowerShell 函数 (function fooo([String] $a) { if ($a -ne $null) { [Console]::WriteLine("Not Null. Is '" + $a + "'"); } }; fooo $null;) 可以观察到相同的行为,因此这一定是 PowerShell 处理string的方式一般参数。 -
你在哪里定义一个?
-
感谢您的调查。似乎这只是 PowerShell 试图过度提供帮助。我知道 PowerShell 有时会在不要求“有帮助”的情况下强制转换对象,但我没想到它实际上会将其实例化为对象。我想在 C# 代码中使用 String.IsNullOrEmpty() 是解决这个问题的最佳解决方案。
标签: string powershell null parameter-passing powershell-5.0