gpt4 book ai didi

c# - 在 PowerShell 中隐式转换为 C# 中定义的结构的 bool 失败

转载 作者:行者123 更新时间:2023-12-05 04:32:35 25 4
gpt4 key购买 nike

为什么隐式转换为 [byte] 有效,但当用 bool 替换 byte 时它不再有效?

我。 e.以下作品...

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

这会产生以下错误:

Cannot convert value "MyBool" to type "System.Boolean". Boolean parameters accept onlyBoolean values and numbers, such as $True, $False, 1 or 0.

请注意,在 C# 中,到 bool 的隐式转换按预期工作:

public class MyBoolTest {
public static void Test() {
bool b = new MyBool( true ); // OK
}
}

所以这似乎只是一个 PowerShell 问题。

(PS版本:7.2.2)

最佳答案

Santiago Squarzon 的协助下,您已经自己完成了大部分发现工作,但让我试着总结一下:

您看到两个不同的有问题的 PowerShell 行为:

  • 有问题的行为 A:PowerShell 有自己的内置 bool 转换逻辑,不幸的是,它支持隐式或显式 .NET 转换运营商。

    • this answer 的底部总结了这个内置逻辑的规则,这解释了为什么它考虑 任何 [MyBool] 类型的实例 - 甚至是 [MyBool]::new($ false) - $true,不幸的是。

    • 只有在实例未首先被强制转换为 bool 值的操作中,转换运算符才会受到尊重,对于大多数运算符而言,这意味着在 LHS 上使用实例:

      [MyBool]::new($false) -eq $false # -> $true

      [MyBool]::new($false), 'other' -contains $false # -> $true

      # With -in, it is the *RHS* that matters
      $false -in [MyBool]::new($false), 'other' # -> $true
    • 相比之下,如果您强制 bool 上下文 - 通过在(通常)LHS 上使用 bool 值或使用隐式到 bool 值强制转换 - PowerShell 的内置逻辑 - 不支持转换运算符 - 开始:

      $false -eq [MyBool]::new($false) # -> !! $false

      $false, 'other' -contains [MyBool]::new($false) # -> !! $false

      # With -in, it is the *RHS* that matters
      [MyBool]::new($false) -in $false, 'other' # -> !! $false

      # Most insidiously, with *implicit* coercion.
      if ([MyBool]::new($false)) { 'what?' } # -> !! 'what?'
  • 有问题的行为 B:当您使用 [bool]type-constrain 变量时,即当您放置类型文字时在被赋值变量的左边(例如,[bool] $b = ...,而不是 $b = [bool] (.. .)[1] 绑定(bind) [bool] 参数 的规则 - 意外且不恰本地 - 启动,其中与任何类型接受的内置到 bool 转换不同 - 非常严格,如错误消息所示。

    • 也就是说,只有 $true$falsenumbers(零映射到 $false$true 的任何非零值)都可以传递给类型为 [bool] 的参数。

      • 请注意,[bool] 参数本身很少见,因为 bool 逻辑是 PowerShell 惯用的用 [switch] 参数表示的,当它是(非-typically) 给定一个显式参数,限制性更强,只接受 $true$false
    • 这种有问题的行为 - 不恰本地将参数逻辑应用于(非参数)变量 - 是GitHub issue #10426的主题.


[1] 两者之间的区别在于类型约束 - [bool] $b = ... - 有效地锁定数据类型变量 $b,以便后面尝试分配新值的尝试被强制为同一类型。相比之下,$b = [bool] (...) 仅应用一个临时的cast 来强制转换,而不会阻止以后的赋值分配具有不同数据类型的值.

关于c# - 在 PowerShell 中隐式转换为 C# 中定义的结构的 bool 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71631192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com