API:
namespace ClassLibrary1
{
public class Class1
{
public static string Test(string input)
{
if (input == null)
return "It's null";
if (input == string.Empty)
return "It's empty";
else
return "Non-empty string of length " + input.Length;
}
}
}
Сценарий:
add-type -path C:\temp\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll
[classlibrary1.class1]::Test($null)
[classlibrary1.class1]::Test([object]$null)
[classlibrary1.class1]::Test([psobject]$null)
[classlibrary1.class1]::Test($dummyVar)
[classlibrary1.class1]::Test($profile.dummyProperty)
Вывод:
It's empty It's empty It's empty It's empty It's empty
Что я пропускаю?
Согласно этой проблеме с подключением MS, это известная проблема. Там также размещена пара обходных путей, например, использование рефлексии для передачи параматеров (что умно, но глупо, что это необходимо). Будем здоровы!
именно так ведет себя PowerShell - он всегда будет пытаться преобразовать объект до тех пор, пока он конвертируется в целевой тип (в данном случае строка). PowerShell всегда будет преобразовывать ноль (отсутствие значения) в String.Empty при приведении в строковый объект.
Взгляните на книгу Брюса Пейета "Windows PowerShell в действии", вокруг страницы 142. Брюс - один из архитекторов, стоящий за PowerShell
Это что-то вроде одной из тех задокументированных маленьких догадок языка сценариев, и мы определенно должны знать об этом
.