Powershell C#和#x27 ;;s的默认运算符,如果是,语法是什么?

Powershell C#和#x27 ;;s的默认运算符,如果是,语法是什么?,powershell,Powershell,在C#中,可以使用以下命令获取任何类型的默认值: var i=default(int);//i==0 //在C#7.1中+ int j=默认值;//j==0 PowerShell中是否有类似的构造,如果有,是什么?据我在谷歌搜索和测试中确定,默认值仅当出现在开关块中时,PS才能识别。PowerShell没有直接的语言构造,因为它不需要它——由于它的松散类型,您几乎不需要生成特定类型的值,并且不支持创建泛型类型或函数。如果您不做任何特殊操作,则非类型化变量的开头为$null。类型化变量以您显式给

在C#中,可以使用以下命令获取任何类型的默认值:

var i=default(int);//i==0
//在C#7.1中+
int j=默认值;//j==0

PowerShell中是否有类似的构造,如果有,是什么?据我在谷歌搜索和测试中确定,
默认值
仅当出现在
开关
块中时,PS才能识别。

PowerShell没有直接的语言构造,因为它不需要它——由于它的松散类型,您几乎不需要生成特定类型的值,并且不支持创建泛型类型或函数。如果您不做任何特殊操作,则非类型化变量的开头为
$null
。类型化变量以您显式给定的任何值开始,由于PowerShell的自由转换规则(
[int]”
[int]$null
都是
0

只有在极少数情况下才会失败,例如尝试声明类型为
DateTimeOffset
的变量,因为没有默认构造函数,
$null
不会转换。可以说,修复方法是使用类型提供的任何内容显式构造值(
[DateTimeOffset]$d=[DateTimeOffset]::Now
[DateTimeOffset]$d=[DateTimeOffset]::MinValue
[DateTimeOffset]$d=“0001-01-01 00:00Z”
)。只有在非常罕见的情况下,你有一个动态类型,并且你想得到C#会给你的
default
,你需要一些特殊的代码。您可以在纯PowerShell中执行此操作(好吧,几乎是这样,我们需要调用自.NET 1.0以来可用的方法):

然后,
[DateTimeOffset]$d=Get Default DateTimeOffset
起作用(在这种情况下无法推断类型,尽管您当然可以从变量中省略它)


当然,这会在每次调用时创建一个垃圾数组;但是,它不会调用类型本身的任何构造函数。有更多复杂的方法可以避免创建数组,但它们都涉及到使用泛型方法(依赖LINQ)或显式编译C#变得复杂,因此不值得演示,因为它们不太通用。显然,即使是上面的函数也应该只在可能需要它的特殊情况下使用,而不是作为初始化变量的一般方式使用——通常你知道类型和如何初始化它,或者你一开始就不关心类型。

[int]::default
?@iRon:这与
[int]::coffeecup
,默认情况下,PowerShell允许您引用不存在的成员而不会出错。在
设置StrictMode
下,这将给出一个错误。也就是说--
[int]::new()
被接受,这可能是值类型的
默认值的最接近值。不过,对于引用类型,您仍然需要自己编写
$null
。类似于
[int]$null
[int]$i=$null
的东西也“碰巧起作用”,但这涉及到PowerShell自己的转换约定,我不知道结果是否被记录到了这样的程度,以至于您可以说它们在所有情况下都与
默认值
相同。如果您不是在寻找确切的语义,而只是寻找一个等价的语义,那么它可能会这样做。
$null
转换技巧至少在枚举的情况下失败(PowerShell需要有效的标签)。不过,他们仍然接受
::new()
。有趣的是,PowerShell允许您声明一个没有标签的枚举(
enum E{}
),然后拒绝转换!PowerShell变量永远不会没有值;未赋值的变量如果为数字,则为0;如果为字符串,则为
$null
。对象的“默认”值将由无参数构造函数在调用时的行为定义。
Function Get-Default([Type] $t) { [Array]::CreateInstance($t, 1)[0] }