- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么隐式转换为 [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
、$false
和 numbers(零映射到 $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/
我在使用以下代码时遇到问题: function http_file_exists($url){ $f=fopen($url,"r"); if($f){ fclose($f); retu
我已经通过 Git 部署到 Azure 几个月了,没有出现重大问题,但现在我似乎遇到了一个无法克服的错误。 我创建了一个新的 Azure 网站,为正在开发的项目创建单独的预览链接。我在新站点上设置了
我已经通过flutter创建了一个App并完成了它,我想在flutter文档中阅读时进行部署。 我收到此错误: FAILURE: Build failed with an exception. * W
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
我正在尝试使用 RapidJSON 解析从服务器接收到的数据。以下是收到的确切字符串: [ { "Node": "9478149a08f9", "Address": "172.17
我尝试为 ios 编译 OpenCV。我总是收到这些错误。我用不同版本的opencv试了一下,结果都是一样的。 我运行这个:python 平台/ios/build_framework.py ios_o
我在一台机器上做基本的发布/订阅,我的客户端是 StackExchange-Redis 的 C# 客户端,我在同一台机器上运行基于 Windows 的 Redis 服务器(服务器版本 2.8.4) 当
我有这段代码,但无法执行,请帮我解决这个问题 连接 connect_error) { die ("connection failed: " . $terhubung->connect_erro
我在 tomcat 上运行并由 maven 编译的 Web 应用程序给出了以下警告和错误。我可以在本地存储库中看到所有 JAR,但有人可以帮忙吗。 WARNING: Failed to scan JA
我正在 Windows 8 上使用 Android Studio 开发一个 android 应用程序,我正在使用一些 native 代码。突然间我无法编译我的 C 文件。当我运行 ndk-build
下面的代码对类和结构的成员进行序列化和反序列化。序列化工作正常,但我在尝试使用 oarch >> BOOST_SERIALIZATION_NVP(outObj); 反序列化时遇到了以下错误; 代码中是
如果我运行此命令“rspec ./spec/requests/api/v1/password_reset_request_spec.rb”,此文件中的所有测试都会通过。 但是,当我运行“rspec”时
我在尝试执行测试以使用 Protractor 上传文件时出错,我的代码是这个 it('it should be possible to upload a file', function() {
System.loadLibrary("nativefaceswap"); 当我运行我的应用程序时,我在 Android Studio 中发现了此类错误。在logcat中显示: java.lang.U
我希望有人能帮助我!使用任何方法或命令行的任何 SSL/HTTPS 调用均无效。 我在 Windows 10 中使用 Ubuntu Server 18.04 作为子系统。我的问题是昨天才开始出现的,因
通过删除这两个值将日期字段从 null=True 和 Blank=True 更改为 required 时,使用 db.alter 命令时遇到问题。 当以下行被注释掉时,迁移运行不会出现问题。
我第一次使用 Heroku 尝试创建应用程序(使用 SendGrid 的 Inbound Parse Webhook"和 Twilio SMS 通过电子邮件发送和接收 SMS 消息)。通过 Virtu
我正在将我的 swift 项目更新到 Xcode 7 上的 Swift 2.0。xcode 在构建项目时报告了以下错误: 命令/Applications/Xcode.app/Contents/Deve
在我的代码中,SSL 库函数 SSL_library_init() 没有按预期返回 1。我如何才能看到它返回了什么错误? 我在 SSL_library_init() 之后调用了 SSL_load_er
我正在尝试运行在以下链接中找到的答案: Asynchronously Load the Contents of a Div 但是当我这样做时,我会遇到我不太理解的错误。 我的代码: $(documen
我是一名优秀的程序员,十分优秀!