.NET 4 中是否允许通用运算符重载?

2023-12-30

我假设“否”,但我在谷歌上找不到确凿的证据来支持这个假设。使用关键字“vb.net“通用运算符重载””仅产生 1 个结果,删除“重载”会产生更多结果,但没有直接说明该问题。

我的想法是给定一个抽象类,如果能够实现派生类可以使用的通用运算符重载,在这种情况下,当所述运算符重载必须返回派生类的新副本时,那就太好了,但代码每个过载都是相同的。如果那有意义的话。

这又回到了我之前关于自定义枚举类和重载按位运算符的问题(And, Or, Not, & Xor),但是,这种特殊的想法只是出于“这能做到吗?”的好奇心。

这是我的自定义枚举之一的基本外观:
家长,EBase没什么特别的,只是托管常见的Name and Value属性,加上两个共享运算符,op_Equality and op_Inequality.

Friend NotInheritable Class EExample
    Inherits EBase

    Private Sub New()
    End Sub

    Friend Shared Function GetValue(ByVal Name As String) As Enums
        Dim tmpOffset As Int32 = Array.IndexOf(_Names, Name)
        Return If(HasContent(Name), If(tmpOffset <> -1, Values(tmpOffset), Nothing), Nothing)
    End Function


    ' Num of Enums defined.
    Friend Shared ReadOnly MaxEnums As Int32 = 5

    ' String literals.
    Private Shared ReadOnly _Names As String() = New String() _
        {"one_adam", "two_boy", "three_charles", "four_david", "five_edward"}

    ' Enums.
    Friend Shared ReadOnly OneA As New Enums(_Names(0), 1)
    Friend Shared ReadOnly TwoB As New Enums(_Names(1), 2)
    Friend Shared ReadOnly ThreeC As New Enums(_Names(2), 4)
    Friend Shared ReadOnly FourD As New Enums(_Names(3), 8)
    Friend Shared ReadOnly FiveE As New Enums(_Names(4), 16)


    ' Enum Values Array.
    Friend Shared ReadOnly Values As Enums() = New Enums() _
        {OneA, TwoB, ThreeC, FourD, FiveE}


    Friend NotInheritable Class Enums
        Inherits EBase

        Private Sub New()
        End Sub

        Friend Sub New(ByVal Name As String, ByVal Value As Int32)
            MyBase.Name = Name
            MyBase.Value = Value
        End Sub
    End Class
End Class

以下是这些东西的使用方法:

Dim Foo As EExample.Enums
Foo = EExample.TwoB
Debug.Print(Foo.Name)

将打印two_boy

现在,考虑到这一点,如果我想做以下事情:

Dim Foo as EExample.Enums
Foo = EExample.OneA Or EExample.FiveE

我必须定义一个运算符重载Or inside the EExample.Enums定义。这个运算符重载看起来怎么样?

Public Shared Operator Or(ByVal lhOp As Enums, ByVal rhOp As Enums) As Enums
    Return New Enums(String.Concat(lhOp.Name, "|"c, rhOp.Name),
                     lhOp.Value Or rhOp.Value, True)
End Operator

我必须退回一个新的EEXample.Enums包含按位或运算的对象Value父母的财产EExample枚举。对于名称,我只是连接Name属性与管道字符一起,直到我想到更好的东西。

假设我有 20 个枚举类,类似于EExample。我必须为每个定义复制所有运算符重载代码,即使在 IDE 中,它看起来完全相同。然而,在 IL 中,每个重载都是特定于包含父枚举类的:

.method public specialname static class MyAssembly.EExample/Enums 
        op_BitwiseOr(class MyAssembly.EExample/Enums lhOp,
                     class MyAssembly.EExample/Enums rhOp) cil managed
{ ... }

但!如果在中定义,通用运算符重载将解决此问题EBase!

Friend Interface IEnums
    Property Name As String
    Property Value As Int32
End Interface

Public Shared Operator Or(Of T As IEnums)(ByVal lhOp As T, ByVal rhOp As T) As T
    Return New T(String.Concat(lhOp.Name, "|"c, rhOp.Name),
                 lhOp.Value Or rhOp.Value, True)
End Operator

然后(理论上无论如何),调用EExample.OneA Or EExample.FiveE会起作用,因为编译器知道从以下位置调用通用运算符重载EBase, 我知道EExample.Enums匹配IEnums接口约束,自动供给T.

或者我只是在没有桨的情况下在某条小溪里游泳并且过度分析事物。但这是一个有趣的想法,不是吗? StackOverflow 的共识是什么?我需要稍微减少一下香料吗?

PS:我知道,在最后一个例子中,Return New T( ... )是无效的,但我想不出可以阐明基本思想的正确语法。


根据我在,不允许通用运算符。第 9.8 节说

至少其中一个操作数或返回值的类型必须是包含该运算符的类型。

稍后当它描述声明语法时,不会像第 9.2.1 节中的方法那样考虑通用说明符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 4 中是否允许通用运算符重载? 的相关文章

  • 如何使用“instanceof”实现泛型的“equals”方法?

    我有一堂课接受泛型 我想覆盖equals以一种不尴尬的方式 即看起来干净并且代码量最少的东西 但对于非常一般的用例 现在我有这样的事情 public class SingularNode
  • xmlns 元素的顺序重要吗

    我不知道如何在 google 中搜索此内容 但是 xmlns 元素的问题在 XML 文件中重要吗 我正在 ASP NET VB 中使用 XMLWriter 创建一个 XML 文件 并且尝试匹配我提供的示例
  • Scala UpperBound 和 LowerBound 概念

    下面是我尝试运行的代码 class Student def printDetails println I am a student def printSomeOtherDetails println I love Studying clas
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository
  • “重载”在子类中如何工作?

    我有一个基类和一个子类 它们都有相同的属性 但我不明白whyVB 希望我对子类中的属性使用 重载 区别在于该属性的子类版本是Shared而父类基本上是为了结构 这些属性如下所示 Public MustInherit Class Parent
  • 非 Web 项目的 XML 序列化程序集

    我正在尝试解决 VS 2010 VB NET 和 C 中自动生成序列化程序集的众所周知的问题 项目设置中的 生成序列化程序集 选项对于非 Web 项目没有任何作用 请参阅http blog devstone com aaron archiv
  • String.Format - 它如何工作以及如何实现自定义格式字符串

    With String Format 例如可以格式化DateTime对象以许多不同的方式 每次我寻找所需的格式时 我都需要在互联网上搜索 我几乎总能找到一个可以使用的例子 例如 String Format 0 MM dd yyyy Date
  • 如何在 vb.Net 中设置默认表单?

    如何将第四个表单设置为在 Visual Studio 2008 中按 f5 时将运行的默认表单 因为表单 1 始终是第一个启动的 在解决方案资源管理器中右键单击您的项目 选择属性 选择应用程序选项卡 从 启动表单 下的下拉列表中选择您的表单
  • 从泛型类继承时需要 T 的列表或枚举器的建议

    我知道答案并不简单 而且我已经使用了一些 我认为丑陋的 木棍 我只是在寻找一些优雅的答案 抽象类 public interface IOtherObjects public abstract class MyObjects
  • 我可以创建一个 List> 吗?

    我正在尝试创建一个列表WeakReference使用 4 5 泛型实现 这样我就可以避免类型检查和转换WeakReference目标 但 WeakReference
  • 检查 listbox1 中是否已存在某个项目

    在 form1 中 我有两个列表框 listbox1 listbox2 加载按钮和保存按钮 此代码会将 listbox1 selecteditem 写入 txt 文件 然后 loadbutton 将加载信息 但在 listbox2 中我希望
  • 使用泛型进行选择排序

    我对整数进行了选择排序并且它正在工作 当我尝试修改程序以使用泛型时 编译器会抱怨 我不知道如何修复它 如果有人能提出一些建议和建设性意见 我将不胜感激 这是代码 public class SelelctionSort public stat
  • .net 应用程序中的内存泄漏

    我正在 VB net 2005 中开发一个桌面应用程序 该应用程序包含一个间隔为 1 分钟的计时器 每次计时器计时 就会执行一组函数 大部分与数据库相关 最初 应用程序运行良好 在进程 任务管理器 中 每次调用计时器时 CPU 使用率都会达
  • 您是否必须在 VB.NET 中显式创建表单实例? [复制]

    这个问题在这里已经有答案了 如果一个项目包含Form类 形式可以通过以下方式显示 Form1 Show 或者是否需要首先创建表单的实例 Dim frm As New Form1 frm Show 正如所建议的 使用表单名称使用默认实例 而第
  • Spring MVC:通用 DAO 和服务类

    我正在 Spring MVC 中编写网页 我使用 Generic DAO 编写了所有 DAO 现在我想重写我的服务类 我该如何写 通用服务 我的 DAO 如下 DAO package net example com dao import j
  • 不兼容的类型:Class 无法转换为 Class,其中 CAP#1 是新类型变量

    当我编写一些代码时 我遇到了一些让我烦恼的事情 我在下面的代码示例中收集了两个示例 The cls1行使用 lambda 表达式但不编译 而cls2行使用方法引用并编译 我知道 如果我使用非泛型对象 那么那里没有问题 但在这里 我使用泛型
  • 打印“X”个字符数与“X”字符串长度的所有可能组合(暴力破解)

    我正在尝试编写一个单词组合生成器 我的意思是打印 X 个字符数与 X 字符串长度的所有可能组合 首先 我需要说的是 我在 StackOverFlow 中看到了一个关于这个问题的问题 其中有很多单词生成器的答案来执行此操作 在不同的语言上 但
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun

随机推荐

  • 使用向量和对的邻接列表图表示

    我想实现竞争性编程 1 书中的邻接列表图表示 该实现使用 V 顶点的向量 并且对于每个顶点 v 另一个 包含有连接的对 相邻顶点及其边权重 的向量 v 我在获取该图的输入并显示输出时遇到问题 在书中 他们做了这样的声明 include
  • Eclipse 格式化程序在空注释行中添加空格

    Eclipse 代码格式化程序在每个空 Javadoc 注释行中添加一个尾随空格 请参见屏幕截图 同事的格式化程序总是删除这些空格 从而产生恼人的 SVN 差异 他声称使用相同的格式化程序设置 XML 文件 尽管如此 我尝试了格式化程序设置
  • 是否可以检测文本何时换行?

    是否可以检测文本换行的位置 Lorem ipsum dolor 坐 amet 假设上面的文本在 dolor 一词之后换行 如何检测到它并在那里插入一些标记 这样它就可以了Lorem ipsum dolor div class wrap ma
  • 如何在 swift 2.2 中休眠几毫秒?

    请有人告诉我如何在 swift 2 2 中使用 sleep 几毫秒 while true print sleep for 0 002 seconds sleep 0 002 not working but while true print
  • R 地图()中的县 FIPS 准确吗?

    当我运行以下代码时 require maps colors lt data frame county county fips polyname color rep FFFFFF nrow county fips stringsAsFacto
  • UWP Navigation通过 MVVM 进行视图导航

    我在我的应用程序中使用 NavigationView 作为主控件 并在页面加载时使用框架
  • 如何暂停和恢复jquery间隔

    我用 jQuery 制作了一个自定义滑块 为此 我使用了 setInterval 函数 timer setInterval function 8000 但我无法暂停和恢复间隔 我有 2 个按钮 播放 暂停 我想使用 假设我在 3 秒后单击
  • 如何从项目级别指定 --add-opens 并确保无论以何种方式运行我的应用程序都将其考虑在内?

    我最近迁移到 Java 17 随之而来的一些限制要求我使用 add opens因为运行我的应用程序时存在一个依赖项 当我需要添加这个java jar命令已运行 现在我找到了这些解决方案 我可以将其添加到运行该项目的 Dockerfile 中
  • Oracle SQL 全外连接

    我使用 FULL OUTER JOIN 连接 2 个表 运行并给出输出需要 6 分钟 SELECT FROM tab1 FULL OUTER JOIN tab2 ON tab1 id tab2 id 我使用 LEFT OUTER JOIN
  • 从 eclipse+gradle 运行时,Spring Boot 错误地加载测试配置

    当我从 Eclipse STS 作为 Java 应用程序 或 Spring Boot 应用程序 运行 Spring Boot 应用程序时 该应用程序失败 因为它尝试从以下位置加载配置 Configuration 测试类路径 问题是它适用于基
  • 将 C++11 与 2013 年左右编译器一起使用的选项

    是否有任何完整 正确的实施可用 现在 对于 C 11 正则表达式 关于编译器支持与库支持的注意事项 编译器支持 编译器可以识别针对相关功能添加到语言中的任何新语法 利用添加到程序中的新功能的代码将进行编译 图书馆支持 更新库以实际实现该功能
  • 重新排序时 UITableViewCell 的子视图不可见

    当我重新排序 UITableViewCells 时 拖动时单元格的子视图不可见 无论我在 UITableViewCell 子类中还是在 Storyboard 中以编程方式添加子视图 我总是得到相同的结果 拖动时是否有可能看到带有子视图的真实
  • JMeter分布式测试和命令行参数

    我一直在使用 JMeter 参数来指定负载测试的测试属性 例如 testduration rampup period 等 我在 shell 脚本中指定这些参数 它看起来像这样 JMETER PATH home
  • VB.NET:VB.NET 中的静态 T (C#) 是什么?

    考虑 public static T GetValueOrDefault
  • 程序集/Nasm - 分段错误(核心转储)错误

    我对 NASM 很陌生 我正在尝试执行我找到的在线 MASM 示例 但转换为 NASM 很痛苦 它正确编译并生成输出文件 但是当我尝试运行它时 它给出了分段错误 核心转储错误 我不知道它是什么 操作系统是Ubuntu 尝试在以下环境下执行编
  • 通配某些 YYYYMMDD 日期

    我正在尝试向我的 perl 脚本提供几个文件按日历周 它只是获取从 bash 获取的所有文件 foreach my input ARGV 命名约定如下 FILE XYZ 20140908 0000 000XYZ 这个月的第一周没问题 FIL
  • 无法导出 Kendo Grid 中的隐藏列

    我想隐藏 Kendo Grid 上的一些列并将它们导出到 Excel 作为可见列 然而 使用隐藏 真实 or 可见 假 没有任何意义 并且这些字段不会被导出 解决方法this http www telerik com forums exce
  • Autofac 具有同一接口的多个实现

    我正在使用 Autofac 并且希望有一个接口的多个实现 如何配置 Autofac 以便根据当前类型解决依赖关系 更具体地说 我有一个接口和多个应该链接在一起的实现 让我解释一下 虚构的类 public interface IMessage
  • 在postgresql中创建表空间

    我正在尝试在 postgres 中创建表空间 但遇到所有权问题 我正在使用的命令是 CREATE TABLESPACE magdat OWNER maggie LOCATION home john BSTablespace 我收到错误 ER
  • .NET 4 中是否允许通用运算符重载?

    我假设 否 但我在谷歌上找不到确凿的证据来支持这个假设 使用关键字 vb net 通用运算符重载 仅产生 1 个结果 删除 重载 会产生更多结果 但没有直接说明该问题 我的想法是给定一个抽象类 如果能够实现派生类可以使用的通用运算符重载 在