Почему PowerShell сообщает мне, что строка не является строкой? И только при вызове String.Length сначала

Я устанавливаю XML-атрибут с помощью String, и PowerShell сообщает мне, что «только строки могут использоваться в качестве значений для установки свойств XmlNode». Вот простой пример. Во-первых, я запускаю это:

$xmlDoc = [xml]@"
<root>
  <ComponentRef Id="a" />
</root>
"@

$newId = "b"

$length = $newId.Length

Write-Host ("`n`$newId is a string, see: `$newId.GetType().FullName = " + $newId.GetType().FullName + "`n")
Write-Host ("Running `"`$xmlDoc.root.ComponentRef.Id = `$newId`"...`n")
$xmlDoc.root.ComponentRef.Id = $newId
Write-Host ("ComponentRef.Id is now: " + $xmlDoc.root.ComponentRef.Id)

Для меня вывод:

$newId is a string, see: $newId.GetType().FullName = System.String

Running "$xmlDoc.root.ComponentRef.Id = $newId"...

Cannot set "Id" because only strings can be used as values to set XmlNode properties.
At D:\Build\Tools\mass processing\Untitled4.ps1:14 char:27
+ $xmlDoc.root.ComponentRef. <<<< Id = $newId
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

ComponentRef.Id is now: a

Это сообщение об ошибке должно быть неверным. Значение справа от знака равенства равно строке, как показано в выходных данных выше. Но произошла ошибка, поэтому атрибут XML по-прежнему читается как «a». Теперь это становится более странным. Давайте закомментируем строку, вызывающую $newId.length, и посмотрим, как она работает правильно.

Комментирование как таковое:#$length = $newId.Length. Вывод теперь :

$newId is a string, see: $newId.GetType().FullName = System.String

Running "$xmlDoc.root.ComponentRef.Id = $newId"...

ComponentRef.Id is now: b

. Я не прошу исправления, потому что знаю, как обойти эту проблему, приведя к [string] справа от последнего оператора присваивания. Что я хотел бы знать, так это:

Может ли кто-нибудь объяснить, почему вызов $newId.Length (геттером! )мог заставить PowerShell думать, что $newId больше не является строкой?

Спасибо!

6
задан Vimes 27 April 2012 в 17:58
поделиться