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