gpt4 book ai didi

vb.net - .NET 4 中是否允许泛型运算符重载?

转载 作者:行者123 更新时间:2023-12-03 21:35:44 26 4
gpt4 key购买 nike

我假设“否”,但我无法在 Google 上找到支持这一假设的确凿证据。使用'vb.net“通用运算符重载”'的关键字会产生1个结果,删除'overload'会给出更多,但没有直接说明这个问题。

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

这涉及到我之前关于自定义 Enum 类和重载按位运算符( AndOrNotXor )的问题,但是,这种特殊的想法仅仅是出于对“可以完成了吗?”。

这是我的一个自定义枚举的基本外观:
parent ,EBase没什么特别的,只是托管常见的NameValue属性,加上两个共享运算符,op_Equalityop_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 定义一个运算符重载 里面 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 parent 的属性(property) 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接口(interface)约束,并自动提供 T .

那或者我只是在没有桨和过度分析的情况下沿着一条小溪游泳。但这是一个有趣的想法,不是吗? StackOverflow 的共识是什么?我需要稍微放下香料吗?

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

最佳答案

根据我在 language specification 中看到的内容, 不允许使用泛型运算符。第 9.8 节说

The type of at least one of the operands or the return value must be the type that contains the operator.



稍后当它描述声明语法时,没有像第 9.2.1 节中的方法那样考虑泛型说明符。

关于vb.net - .NET 4 中是否允许泛型运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4446341/

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