Установка для Nullable Enum значения $null — должно ли это действительно вызывать исключение PSInvalidCastException?

Установка Nullable Enum в $null в PowerShell вызывает исключениеSystem.Management.Automation.PSInvalidCastException. Это неожиданно (по крайней мере для меня). Есть ли этому разумное объяснение? Вот пример, который показывает, как установка Nullable Int32 выполняется успешно, но установка Nullable Enum вызывает исключение:

Add-Type @"
public enum ColorEnum
{
    Red = 1,
    Blue = 2,
    Green = 3,
}

public class Thing
{
    public ColorEnum? NullableColor = ColorEnum.Blue;
    public System.Int32? NullableInt = 123;
}
"@

$test = New-Object Thing

# Setting the Nullable Int32 to $null works, as expected.
$test.NullableInt = $null

# Setting the Nullable Enum to $null causes exception.
$test.NullableColor = $null

Сообщение об исключении гласит:

Настройка исключения "NullableColor": "Невозможно преобразовать null в тип "ColorEnum" из-за недопустимых значений перечисления. Укажите одно из следующих значений перечисления и повторите попытку. Возможные значения перечисления: "Red, Blue, Green" ."

Причина, по которой я хотел бы иметь возможность использовать Nullable Enum, а не Enum со значением по умолчанию 0, заключается в том, что Enum, который я хочу использовать, представляет столбец базы данных, допускающий значение NULL, который, как ожидается, будет нулевым, если не установлено допустимое значение. . Я не могу изменить модель базы данных, поэтому, к сожалению, кажется, что решением может быть использование Int32 вместо Enum.

Кто-нибудь еще испытал это? Возможно, это ошибка?

$PsVersionTable:

Name                           Value                                                                                                                                                                                            
----                           -----                                                                                                                                                                                            
PSVersion                      3.0                                                                                                                                                                                              
WSManStackVersion              3.0                                                                                                                                                                                              
SerializationVersion           1.1.0.1                                                                                                                                                                                          
CLRVersion                     4.0.30319.18444                                                                                                                                                                                  
BuildVersion                   6.2.9200.16481                                                                                                                                                                                   
PSCompatibleVersions           {1.0, 2.0, 3.0}                                                                                                                                                                                  
PSRemotingProtocolVersion      2.2     

person robbsville    schedule 05.11.2014    source источник
comment
Мне это кажется ошибкой. Вы можете отправить его здесь — connect.microsoft.com/PowerShell/Feedback.   -  person Roman Kuzmin    schedule 05.11.2014
comment
Мне тоже кажется багом. GJ в его поиске. Вот ссылка с дополнительными сведениями о перечислениях, допускающих значение NULL: stackoverflow.com/questions/4337193/how-to-set-enum-to-null   -  person Micky Balladelli    schedule 05.11.2014


Ответы (1)


Это была ошибка в PowerShell 4 (и, возможно, 3, но я не пробовал).

Это было исправлено в PowerShell V5 (проверено по последним внутренним сборкам), я считаю, что это должно быть исправлено в общедоступных сборках, таких как предварительная версия WMF5 за сентябрь или предварительная сборка Windows 10.

person Jason Shirk    schedule 05.11.2014