[byte]
是有效的,但当将 byte
替换为 bool
时就不再有效?例如,以下内容是有效的...
Add-Type -TypeDefinition @'
public readonly struct MyByte
{
private readonly byte value;
public MyByte( byte b ) => this.value = b;
public static implicit operator byte( MyByte b ) => b.value;
public static explicit operator MyByte( byte b ) => new MyByte( b );
public override string ToString() => $"{value}";
}
'@
[byte] $d = [MyByte]::new( 1 ) # OK
尽管这段代码非常相似,但它并不能正常工作:
Add-Type -TypeDefinition @'
public readonly struct MyBool
{
private readonly bool value;
public MyBool( bool b ) => this.value = b;
public static implicit operator bool( MyBool b ) => b.value;
public static explicit operator MyBool( bool b ) => new MyBool( b );
public override string ToString() => $"{value}";
}
'@
[bool] $b = [MyBool]::new( $true ) # Error
这将产生以下错误:
无法将“MyBool”值转换为“System.Boolean”类型。布尔参数只接受布尔值和数字,如$True、$False、1或0。
请注意,在C#中,隐式转换为bool
按预期工作:
public class MyBoolTest {
public static void Test() {
bool b = new MyBool( true ); // OK
}
}
所以这似乎只是一个 PowerShell 的问题。
(PS版本:7.2.2)
$b = [bool][MyBool]::new( $true )
可以工作,但[bool] $b = [MyBool]::new( $true )
不行。 - Santiago Squarzon[bool][MyBool]::new( $false )
-> 出乎意料地打印出True
! - zett42bool
完全由 PowerShell 处理,并忽略任何隐式和显式转换运算符(在 LanguagePrimitives.cs 的注释中进一步详细说明)。 - zett42$a = [MyBool]::new(1); $a | gm -force
现在$a
不再有值了 LOL。 - Santiago Squarzon