Я наткнулся на очень странное поведение в PowerShell. Я по умолчанию загружаю сборку MSCORLIB в каждый сценарий PowerShell, который я пишу (я знаю, что он загружается по умолчанию, но все в порядке), и у меня до сих пор не было никаких проблем. Похоже, что если я загружаю MSCORLIB в класс, а затем использую объект этого класса в другом классе, PowerShell утверждает, что этот объект не является экземпляром самого себя, но когда я не загружаю сборку MSCORLIB, все работает должным образом. Чтобы лучше понять меня, нам понадобятся 3 файла, код которых следует:
CLASS.PS1:
USING ASSEMBLY MSCORLIB;
CLASS CLASS{}
CLASS2.PS1:
. .\CLASS.PS1;
CLASS CLASS2
{
STATIC METHOD([CLASS]$PARAMETER){}
}
SCRIPT.PS1
. .\CLASS.PS1;
. .\CLASS2.PS1;
[CLASS2]::METHOD([CLASS]::NEW());
PAUSE
Итак, CLASS
файл определяет CLASS
. CLASS2
файл загружает CLASS
и определяет другой класс, CLASS2
. Он имеет METHOD
, который принимает один PARAMETER
и подтверждает, что он имеет тип CLASS
. Я использую test SCRIPT
, который загружает оба класса, а затем вызывает METHOD
из CLASS2
и дает ему новый экземпляр CLASS
.
, поскольку PARAMETER
из METHOD
действительно имеет тип CLASS
и METHOD
проверяет, что PARAMETER
относится к типу CLASS
, проверка должна пройти, и этот код не должен ничего делать (поскольку METHOD
пусто). Однако этот код выдает следующую ошибку:
Cannot convert argument "PARAMETER", with value: "CLASS", for "METHOD" to type "CLASS": "Cannot convert the "CLASS" value of type "CLASS" to
type "CLASS"."
At C:\PLAYT\SOURCES\3.4\SYSTEM\SCRIPT.PS1:3 char:1
+ [CLASS2]::METHOD([CLASS]::NEW());
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument
Как видите, PowerShell пытается преобразовать CLASS
в себя безо всякой причины. Это абсолютно нелогично, и я не могу найти никаких ошибок в этом коде.
Но самое удивительное, что, если я удаляю USING ASSEMBLY MSCORLIB;
из CLASS
файла, все работает, как ожидается, и проверка проходит успешно.
Я не вижу причины, по которой не загрузка MSCORLIB
сборки в начале файла CLASS
имеет значение. Этого не должно быть, поскольку сборка MSCORLIB
по умолчанию загружается самой PowerShell задолго до того, как PowerShell даже открывает сценарий. Таким образом, MSCORLIB
загружается независимо от того, загружаю я его явно в CLASS
или нет. Еще кое-что. Загрузка MSCORLIB
сборки в CLASS2
или в SCRIPT
не генерирует ошибку. Ошибка генерируется, только если MSCORLIB
загружено в CLASS
.
Информация, которая может иметь отношение к воспроизведению проблемы: Версия PowerShell: 5.1.14393.2312. net Версия: 4.0.30319.42000 Windows Версия: 10.0.14393.2312 ОС: Windows Сервер 2016
Итак, почему это происходит? Что не так с этим кодом?