在调用C#代码时,PowerShell的$null不再是null。
在调用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。
问题出现的原因是在调用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]类型的参数。