将Nullable Enum设置为$ null - 这是否真的导致PSInvalidCastException?

时间:2014-11-05 17:59:35

标签: .net powershell enums powershell-v3.0 nullable

在PowerShell中将Nullable Enum设置为$ null会导致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“。指定一个   以下枚举值,然后重试。可能   枚举值为“红色,蓝色,绿色”。“

我希望能够使用Nullable Enum而不是默认值为0的Enum的原因是因为我要使用的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     

1 个答案:

答案 0 :(得分:5)

这是PowerShell 4中的一个错误(可能是3个,但我还没试过)。

已经在PowerShell V5中进行了修复(针对最近的内部版本进行了验证),我相信它应该在公共版本中修复,例如9月WMF5预览或Windows 10预览版本。