我的想法是给出一个抽象类,能够实现一个泛型运算符重载是很棒的,派生类可以在这种情况下使用,当所述运算符重载必须返回派生类的新副本时,代码对于每个重载都是一样的.如果那有意义的话.
这触及了我之前关于我的自定义Enum类的问题,并且重载了按位运算符(And,Or,Not,& Xor),但是,这个特殊的想法仅仅是出于“它可以完成吗?”的好奇心.
这是我的一个自定义枚举基本上是这样的:
父,EBase没有什么特别之处,只是托管公共名称和值属性,加上两个共享运算符,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 ClassEnd Class
以下是使用方法:
Dim Foo As EExample.EnumsFoo = EExample.TwoBDeBUG.Print(Foo.name)
将打印two_boy
现在,鉴于此,如果我想做以下事情:
Dim Foo as EExample.EnumsFoo = EExample.OneA Or EExample.FiveE
我必须在EExample.Enums定义中为Or定义一个运算符重载.这个运算符怎么过载?
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对象,该对象包含父EExample枚举的Bitwise-Or’ed Value属性.对于名称,我只是将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 Int32End InterfacePublic Shared Operator Or(Of T As IEnums)(ByVal lhOp As T,ByVal rhOp As T) As T Return New T(String.Concat(lhOp.name,True)End Operator
然后(理论上无论如何),调用EExample.OneA或EExample.FiveE会起作用,因为编译器会知道从EBase调用泛型运算符重载,知道EExample.Enums匹配IEnums接口约束,并自动提供T.
那个或者我只是在没有划桨和过度分析的情况下在这里游泳.但这是一个有趣的想法,不是吗? StackOverflow的共识是什么?我需要稍微裁掉Spice吗?
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中是否允许泛型运算符重载?全部内容,希望文章能够帮你解决vb.net – .NET 4中是否允许泛型运算符重载?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)