PowerShell I与子类比较

2023-12-05

假设我们有这 3 个类:

Class BaseClass : System.IComparable
{
    [int] $Value
    BaseClass([int] $v)
    {
        $this.Value = $v
    }
    [int] CompareTo($that)
    {
        If (-Not($that -is [BaseClass])) {
            Throw "Not comparable!!"
        }
        return $this.Value - $that.Value
    }
}
Class SubClassA : BaseClass
{
    SubClassA([int] $v) : base($v)
    {
    }
}
Class SubClassB : BaseClass
{
    SubClassB([int] $v) : base($v)
    {
    }
}

当我们比较以下实例时,此实现效果非常好BaseClass:

$base1 = [BaseClass]::new(1)
$base2 = [BaseClass]::new(2)
Write-Output ($base1 -lt $base2)
# Output: True
Write-Output ($base1 -gt $base2)
# Output: False

但我找不到比较两个子类的两个实例的方法:

$subA1 = [SubClassA]::new(1)
$subB2 = [SubClassB]::new(2)
Write-Output (([BaseClass]$subA1) -lt ([BaseClass]$subB2))

PowerShell 无法执行此代码,引发此错误:

Impossibile confrontare "SubClassA" con "SubClassB".
Errore:
    "Impossibile convertire il valore "SubClassB" di tipo "SubClassB" nel tipo "SubClassA"."

从意大利语翻译成英语,此错误消息听起来像:

Unable to compare "SubClassA" with "SubClassB".
Error:
    "Unable to convert the value "SubClassB" of type "SubClassB" to the type "SubClassA"."

为什么会出现这个错误? 我们如何比较一个实例SubClassA与一个实例SubClassB就好像它们是两个实例BaseClass?

PS:输出$PSVersionTable:

PSVersion                      5.1.17134.1
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17134.1
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

这种行为确实令人惊讶,我看到你已经打开了GitHub 问题来讨论它。

一些额外的想法:

  • PowerShell 的运算符通常具有扩展语义,通常不应假定其在所有情况下都与 C# 对应项的工作方式相同 - 然而,在这种特殊情况下,它们显然should(见下文)。

  • 事实是-lt实际上与基类实例已经指出了一个差异:等效的 C# 类还需要显式重载< and >运营商以支持支持使用<.

  • PowerShell 和 C# 中的接口实现均由派生类继承,因此无需强制转换为基类即可应用-lt.


这里发生的情况似乎是 PowerShell 盲目地尝试将 RHS 转换为 LHS 的类型,而不考虑它们的共享基类。

如果 RHS 类型直接派生自 LHS 类型(但反之则不然),则不会出现此问题;例如。:

$base1 -lt $subA1  # OK: SubClassA (RHS) derives from BaseClass (LHS) 

$subA1 -lt $base1  # !! BREAKS: BaseClass (RHS) does NOT derive from SubClassA (LHS)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell I与子类比较 的相关文章

  • 使用 Powershell 在字符串中搜索反斜杠

    我需要搜索字符串中反斜杠的数量以确定一些文件路径参数 我还没有找到一种方法来搜索反斜杠而不让 Powershell 认为它是一个转义字符 regex Matches FilePath count Or a match 这两个都会出现错误 非
  • 在 powershell 3 中美化 json

    给定一个标准 json 字符串值 jsonString baz quuz cow moo cud foo bar 我怎样才能让这一切都漂亮的换行符 最好没有强力正则表达式 到目前为止我发现的最简单的方法是 jsonString Conver
  • Powershell,从txt文件读取并格式化数据(删除行,删除之间的空格)

    我对 powershell 真的很陌生 我想使用powershell读取txt文件并将其更改为其他格式 从 txt 文件中读取 设置数据格式 删除行 删除之间的空格 记录计数 T 000000002 9 个字符 然后将输出写入新文件 我两天
  • 如何使用 PowerShell 捕获全局击键?

    Powershell 可以监听并捕获按键吗 是否可以编写一个 PowerShell 脚本 例如自动热键 https www autohotkey com 位于托盘中并等待您按下预定义的键盘键才开始执行 并且每次按下所述键时可能不会返回而是触
  • cURL 命令在 git bash 中有效,但在 cmd 和 powershell 中无效

    以下命令在 git bash 中有效 但在 cmd 和 powershell 中无效 curl X POST http localhost 5678 api findgen H Content Type application json d
  • 通过快捷方式更改桌面的 Powershell 脚本

    关于为什么从 w in PS 运行时有效 但从定义为以下的快捷方式运行时无效的任何想法和建议 SystemRoot system32 WindowsPowerShell v1 0 powershell exe File C Users bi
  • 在 C# 中编写批处理脚本的好方法是什么?

    我想用 C 编写简单的脚本 我通常会使用 bat 或 4NT btm 文件 复制文件 解析文本 询问用户输入等等 相当简单 但在批处理文件中正确执行这些操作确实很困难 例如没有例外 我熟悉像 AxScript 这样的命令行 脚本 包装器 这
  • 隐藏powershell输出

    我有以下脚本 param 参数 强制 true 字符串 dest New Item force path dest 1 itemtype directory New Item force path dest 2 itemtype direc
  • Powershell 中的反斜杠

    为什么 split 参数的字符串需要两个反斜杠 而 join 参数的字符串只需要一个反斜杠 反引号是 Powershell 中的转义字符 字符前面的反斜杠有什么作用 path C folder test unit1 testing resu
  • Start-Job 输出去了哪里?

    W gt job start job Write Output hi there throw an error Wait Job W gt job select State Failed HasMoreData True StatusMes
  • PowerShell(2.0,32 位)无法加载 TFS 2010 管理单元...除非可以

    我有一个与 Team Foundation Server 交互的 PowerShell 脚本 当我在 PowerShell 控制台中运行它时 它运行得很好 这对于测试它来说很好 但我想通过双击它或批处理文件或其他东西来运行它 我什至选择右键
  • 相当于 UNIX diff 和 patch 的本机 PowerShell

    我需要潜在地修补文件作为脚本的一部分 为了使脚本所做的事情更具可读性 我想以类似于 UNIX diff 和 patch 方法的方式来实现它 在标准 UNIX 系统上 diff 可以生成特殊格式的文本文件 表示两个文件之间的差异 这可以与要修
  • PSExec 中的会话 ID

    Psexec 无法在远程会话上为我显示记事本 GUI 因此 我尝试获取会话 ID 如下所示 c Users Amitra Downloads PSTools gt PsExec u administrator p force 135 20
  • Powershell:根据属性过滤属性

    我对 PowerShell 的自学经验有限 所以这可能是一些基本的东西 但我似乎无法正确理解 我在 Active Directory 中 需要提取电子邮件地址不以 SamAccountName 开头的用户列表 因此 如果您的登录名是 jdo
  • Powershell 查询的升序和降序

    下面的查询将列出 powershell 中的 cmdlet get command CommandType cmdlet Group Object Property verb 因为我需要按降序对列数进行排序 然后按升序对列进行命名 以下查询
  • 具有相关动态参数的 PowerShell 函数

    我试图定义一个函数 其中动态参数相互依赖 例如 我可能有 1 个参数和两个动态参数 rootPath 驱动器盘符 rootPathItem 第一个文件夹 在驱动器盘符内 rootPathChildItem 第二个文件夹 第一个之内 问题是
  • 如何在 PowerShell 中远程执行 ELEVATED 远程脚本

    我有两台服务器 serverA Windows 2003 服务器 serverB Windows 7的 ServerA包含一个带有批处理文件 deploy bat 的文件夹 需要从提升的 powershell 提示符执行该批处理文件 在Se
  • Powershell脚本将多个远程地址添加到防火墙规则

    我正在尝试编写一个脚本 该脚本将循环遍历本地防火墙规则并更新远程地址表 这是我到目前为止所拥有的 它不起作用 应该很简单 所以不确定发生了什么 该脚本运行时没有错误 但实际上并没有更新任何内容 name Get NetFirewallRul
  • 如何使用Powershell变量打开Edge?

    我已经尝试过以下方法 edge New Object com microsoft edge application edge visible true edge FullScreen true 但我收到错误 New Object Retri
  • 在 Powershell 中远程启动进程,在 Windows 中获取 %ERRORLEVEL%

    一些背景知识 我试图在测试开始时远程启动和停止一些性能计数器 然后在测试结束时停止它们 我是通过 Win2003 机器上的自动化测试框架执行此操作的 测试框架执行命令时无需启动控制台 某些被测系统正在运行 Win2008 我编写了脚本来根据

随机推荐

  • 如何将java函数指针传递给c++本机代码

    我想从java android 代码调用本机c 方法 并将java函数作为参数传递 这样我就能够将函数指针保存在c 代码中 并从本机代码激活它 我选择使用匿名类在java中实现函数指针 并从java中调用本机函数 如下所示 interfac
  • 尝试将 NetCDF 导入 R 时出错

    我很难在 R 中打开 NetCDF 文件 当我尝试用以下命令打开它时 library ncdf read in NetCDF file maize nc lt open ncdf C Users Jo Desktop pft harvest
  • 如何在 C# 中从 Active Directory 获取 System.__ComObject 值

    经过长时间的搜索 我决定就我的问题提出自己的问题 我尝试获取 Active Directory 中属性的值 但总是得到系统 ComObject correspondance compte Properties ENTPersonDateNa
  • 在 python 中使用 subprocess.Popen 运行 java 主类

    我想执行java主类main java通过 python 使用subprocess Popen main java需要 3 个参数 我想知道该怎么做 例如我有一个HelloWorld java class public class Hell
  • Xamarin Forms 按钮中的 Android 资源名称

    Play 商店现在允许您指定要使用的预启动报告模拟器的凭据 为了让模拟器知道将凭据添加到哪个文本字段以及单击哪个按钮进行登录 它会询问文本字段和按钮的资源名称 Xamarin Form 的任何属性是否会转换为资源名称 我尝试查看 obj a
  • 使用异步管道到模板上的属性

    export class MyClass data MyData constructor private dataService DataService this dataService getData subscribe myData g
  • 二元运算符 / 不能应用于 Int 和 Double 类型的操作数 [重复]

    这个问题在这里已经有答案了 您好 对于 Swift 和一般编程新手来说 通过练习给出的代码正是 Playground noun a place where people can play import UIKit let height 12
  • 默认的“”边距有多宽?

    默认值是什么marginHTML为其设置的标签 我注意到有一些自动保证金 但我想知道是否有人知道它是多少 以及是否在px or etc 在大多数主流浏览器中 默认边距为8px在所有方面 它以像素为单位定义为user agent styles
  • 从支持的设备中删除 3G

    我正在尝试找出如何删除 AppStore 中我的应用程序支持的 iPhone 3G 设备 我向 Apple 支持人员发送了电子邮件 要求他们在 reqs 部分中更新它 他们回复说我需要更新我的 UIRequiredDeviceCapabil
  • 如何使用 fxml 在 javafx 中的文本字段上触发焦点事件?

    我在相关 fxml 的控制器类中有这个函数 我需要在焦点从文本字段中触发时触发此函数 但场景生成器没有类似于 onfocusout 的事件 如何使用控制类来实现这一点 FXML private void ValidateBikeNo Too
  • 无法使用 PERMISSIVE 模式保留 pyspark 中损坏的行

    我收到了一个 csv 文件 我需要在其中使用 pyspark 执行某些清理任务 在清理之前 我正在进行一些架构验证检查 下面是我的代码 schema for the input data def get input schema retur
  • 使用 SED 通过带有要删除的行号的索引来删除某些行

    我得到一个大文件 称之为 file txt 可能有 20000 行或更多 其中一些行必须从原始文件中删除 并且必须创建一个包含其余行的新文件 例如 newfile txt 要删除的行位于另一个文件中 例如index txt 所以我是这样的
  • 如何在 Django 中正确覆盖用户 admin

    我想添加内联模型并从 Django 管理中的用户更改表单中排除一些字段 我正在尝试覆盖 Django 的内置UserAdmin保留用户更改设计 class UserCustomAdmin UserAdmin list display id
  • SQL计算sys表中所有表的每一列中的所有空值

    我有以下 SQL SET NOCOUNT ON DECLARE Schema NVARCHAR 100 dbo DECLARE Table NVARCHAR 100 NULL DECLARE sql NVARCHAR MAX IF OBJE
  • 如何为 FormControls 创建自己的组件?

    我想创建一个表单并为其控件使用一个新的自定义组件 所以我创建了一个新组件并将其包含到父窗体中 但是 尽管父表单有一个 formGroup Angular 却抱怨它没有 错误 错误 formControlName 必须与父 formGroup
  • 在 OpenCV 中缩放通道的简单方法

    看来给定一个多通道图像img我不能做到这一点 img cv Scalar 1 5 0 5 2 1 我想按不同的比例缩放每个通道float factor 有没有一种简单的方法可以做到这一点 I could use cv transform 但
  • 可变 NSHTTPURLResponse 或 NSURLResponse

    我需要修改 NSURLResponse 中的响应标头 这可能吗 我刚刚和一个朋友正在谈论这个问题 我的建议是编写 NSURLResponse 的子类 沿着这些思路 interface MyHTTPURLResponse NSURLRespo
  • 如何使用 VBScript 移动鼠标

    我正在尝试使用 VBScript 移动鼠标 我尝试使用 Sendkeys CLICK LEFT x y 和发送密钥 MOVETO 10 20 但它不起作用我也尝试使用鼠标键 所以我可以用键盘移动它 因此使用Sendkeys激活它 但它也不起
  • 进度圆 - 在圆的末端画一个小圆弧 + 更多

    如何在进度圆的末端绘制一个小圆圈 并在其下方 上方添加一个小文本块 示例图片 div class radial progress div class circle div class img div div class mask full
  • PowerShell I与子类比较

    假设我们有这 3 个类 Class BaseClass System IComparable int Value BaseClass int v this Value v int CompareTo that If Not that is