作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我假设“否”,但我无法在 Google 上找到支持这一假设的确凿证据。使用'vb.net“通用运算符重载”'的关键字会产生1个结果,删除'overload'会给出更多,但没有直接说明这个问题。
我的想法是给定一个抽象类,能够实现派生类可以在这种情况下使用的泛型运算符重载会很棒,当所述运算符重载必须返回派生类的新副本时,代码对于每个重载都是相同的。如果那有意义的话。
这涉及到我之前关于自定义 Enum 类和重载按位运算符( And
、 Or
、 Not
和 Xor
)的问题,但是,这种特殊的想法仅仅是出于对“可以完成了吗?”。
这是我的一个自定义枚举的基本外观:
parent ,EBase
没什么特别的,只是托管常见的Name
和 Value
属性,加上两个共享运算符,op_Equality
和 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
定义一个运算符重载
里面
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
属性与管道字符一起,直到我想到更好的东西。
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
.
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.
关于vb.net - .NET 4 中是否允许泛型运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4446341/
我是一名优秀的程序员,十分优秀!