Возможно передать null из Powershell в .Net API, который ожидает строку? - PullRequest
13 голосов
/ 05 января 2010

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

Чего мне не хватает?

Ответы [ 3 ]

14 голосов
/ 06 марта 2013

Чтобы передать нулевое значение в вызов API, используйте [NullString] :: Value.

7 голосов
/ 05 января 2010

Согласно этой проблеме MS connect , это известная проблема.Там также есть пара обходных путей, например, использование отражения для прохождения параметров (это умно, но глупо, что это требуется).Ура!

2 голосов
/ 05 января 2010

так ведет себя PowerShell - он всегда будет пытаться преобразовать объект, если он конвертируется в целевой тип (в данном случае - строка). PowerShell всегда преобразует ноль (отсутствие значения) в String.Empty при приведении к строковому объекту.

Взгляните на книгу Брюса Пайетта "Windows PowerShell в действии", стр. 142. Брюс - один из архитекторов PowerShell.

Это одна из тех задокументированных маленьких ошибок языка сценариев, и мы обязательно должны об этом знать.

...