【问题标题】:PowerShell $null is not null any more when calling into C# code调用 C# 代码时,PowerShell $null 不再为空
【发布时间】: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


【解决方案1】:

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

PS > [foo]::fooo($Null)
Not Null. Is ''
PS > [foo]::fooo([NullString]::Value)
PS >

我在 PowerShell 文档中找不到任何提及需要使用 [NullString] 的内容,the source code for the NullString class 也没有包含任何解释其用途的 cmets。

【讨论】:

猜你喜欢
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2017-03-28
  • 1970-01-01
相关资源
最近更新 更多