在调用C#代码时,PowerShell的$null不再是null。

23 浏览
0 Comments

在调用C#代码时,PowerShell的$null不再是null。

在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. Is ''。这表明在C#中$null不是null。像'IsNullOrEmpty'或'IsNullOrWhiteSpace'这样的方法返回true,所以PowerShell必须将$null隐式转换为字符串。

[foo]::fooo($Null)

有什么想法为什么会发生这种情况,是否有更好的修复方法,而不是在C#中调用String.IsNullOrEmpty?

注:不管指定了哪种C#语言,这种情况都会发生。我正在使用PowerShell V5。

0
0 Comments

问题出现的原因是在调用C#代码时,PowerShell中的$null不再被视为null。解决方法是不要将$null传递给[String]类型的参数,而是应该使用特殊的[NullString]类。

在PowerShell的文档中,并没有提到需要使用[NullString]的必要性,而且[NullString]类的源代码中也没有包含任何解释其目的的注释。

[NullString]类的文档链接:https://msdn.microsoft.com/en-us/library/system.management.automation.language.nullstring.aspx。这个可能性是在PowerShell 3中引入的(2012年以后)。

简单来说,问题的解决方法就是使用[NullString]类代替$null传递给[String]类型的参数。

0