调用 C# 代码时,PowerShell $null 不再为 null

ber*_*ter 5 string powershell null parameter-passing powershell-5.0

在 PowerShell 中,可以定义 C# 代码并执行它。将 $null 传递到以下最简单的函数中表明 not 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
Run Code Online (Sandbox Code Playgroud)

按如下方式调用它会导致输出 Not Null。是 ''。这表明 $null 在 C# 中不为空。'IsNullOrEmpty' 或 'IsNullOrWhiteSpace' 之类的方法返回 true,因此 PowerShell 必须隐式地将 $null 转换为字符串。

[foo]::fooo($Null)
Run Code Online (Sandbox Code Playgroud)

除了在 C# 中调用 String.IsNullOrEnpty 之外,是否有更好的解决方法?注意:这与指定的“Add_Type”的 C# 语言无关。我正在使用 PowerShell V5。

BAC*_*CON 5

显然,解决方案是“如果你想要一个,就不要传递$null给一个[String]参数$null [String]”。[NullString]应该使用一个特殊的类。

PS > [foo]::fooo($Null)
Not Null. Is ''
PS > [foo]::fooo([NullString]::Value)
PS >
Run Code Online (Sandbox Code Playgroud)

[NullString]在 PowerShell 文档中找不到任何提及需要使用的地方,该类的源代码NullString也没有包含任何解释其用途的注释。