Почему ключевое слово "возврат" Powershell вызывает ошибки типа? - PullRequest
4 голосов
/ 08 мая 2009
$xml = [xml] '<node>foo</node>'
function foo2 { return "foo2" }

# all of these fail with the message:
# **Cannot set "foo" because only strings can be used as values to set XmlNode properties.**
$xml.node = foo2
$xml.node = foo2 -as [string]  # because of this issue[1]
$xml.node = (foo2)  

# these work
$xml.node = (foo2).tostring()
$xml.node = (foo2) -as [string]
$xml.node = [string] (foo2)

# yet, these two statements return the same value
(foo2).gettype()
(foo2).tostring().gettype()

1: Функции PowerShell возвращают поведение

Ответы [ 3 ]

6 голосов
/ 11 сентября 2009

Получил подтверждение от команды PowerShell на этот раз. Это похоже на ошибку в адаптере XML. Если вы посмотрите на объект, который выдает foo2 в отладчике, это PSObject. Если вы не используете ключевое слово return и вместо этого просто выводите строку «foo2», то функция возвращает строковый объект.

Ошибка в адаптере XML заключается в том, что он не разворачивает объект PSObject, чтобы получить базовый объект. В результате, когда он пытается назначить объект PSObject для $ xml.node, происходит сбой. На данный момент, в качестве обходного пути, вы можете вручную развернуть psobject следующим образом (или просто привести к [string]):

$xml = [xml] '<node>foo</node>'
function foo2 { return "foo2" }
$xml.node = (foo2).psobject.baseobject
$xml

node
----
foo2
2 голосов
/ 08 мая 2009

В зависимости от контекста, функции могут возвращать массив (длиной 1), где ожидаемый результат находится в индексе 0 в массиве. Чтобы гарантировать, что вы всегда получите скаляр, если возвращен один элемент, заключенный в массив, используйте следующий синтаксис:

$xml.node = $( myfunc )

Надеюсь, это поможет,

-Oisin

p.s. Я знаю, что другие не могут это повторить, как и я, но я подозреваю, что ваш демонстрационный код вырезан из какого-то другого, более крупного скрипта.

0 голосов
/ 08 сентября 2009

Основываясь на этой статье Я бы предположил, что компилятор решает, что он недостаточно хорошо знает тип вывода foo2, чтобы принять его, несмотря на то, что он "очевиден", что это всегда будет строка есть некоторый маршрут кода, способный добавить что-то большее к выводу, который никогда не выполняется ...

Обновление: правильный ответ Кейта Хилла, а не этот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...