VB.Net-如何支持隐式类型转换以及自定义相等
时间:2020-03-06 14:54:10 来源:igfitidea点击:
固定:请参阅底部的注释
我正在实现一个支持两个功能的通用类,即隐式类型转换和自定义相等运算符。好吧,如果这样做的话,它也支持IN平等。
1) if ( "value" = myInstance ) then ... 2) Dim s As String = myInstance 3) Dim s As String = CType(myInstance,String)
我遇到的问题是,如果我支持#2(隐式转换),那么我就不能让我的相等运算符起作用,因为他们抱怨没有转换是最具体的。
我得到的错误是这样(为简便起见,简化了一点):
Overload resolution failed because no accessible '=' is most specific for these arguments: 'Public Shared Operator =(obj As MyClass, data As String) As Boolean': Not most specific. 'Public Shared Operator =(data As String, obj As MyClass) As Boolean': Not most specific. 'Public Shared Operator =(obj1 As MyClass, obj2 As MyClass) As Boolean': Not most specific.
实施此方法的最佳方法是什么。同样重要的是,我应该忽略什么?我已经实现了以下转换
Operator =(ByVal data As String, ByVal obj As classType) As Boolean (and <>) Operator =(ByVal obj As classType, byval data As String) As Boolean (and <>) Operator =(ByVal obj1 As classType, ByVal obj2 As classType) As Boolean (and <>) Equals(obj as Object) as Boolean Equals(compareTo as classType ) as Boolean Equals(compareTo as String) as Boolean Widening Operator CType(ByVal source As String) As classType Widening Operator CType(ByVal source As classType) as String Narrowing Operator CType(ByVal inst As classType) As dataType
在我的加宽运算符中,我进行了一些反思,这就是为什么当我对左侧的字符串进行比较或者赋值时,我希望能够将DOWN隐式转换为String。
A) SomeObject.StringPropertySetter = MyClass
修复)
我不了解所执行的内容,因为我不了解发生了什么。基本类型(即string / double / guid)之间的比较是通过扩展ctype(...)as String(或者Guid等)运算符进行的。最后,除了从类到基本类型实例的分配外,我刚刚实现了这些功能,并且所有测试用例仍然通过
Public Class MyClass(Of BaseType) Widening Operator CType(ByVal source As dataType) As MyClass Widening Operator CType(ByVal source As MyClass) As dataType //conv between inst & base Equals() // for datatype, classType, object Operator <>(MyClass,MyClass) // for comparison between two instances Opeator =(MyClass,MyClass)
注释是c样式,但是代码是vb.net
当然,课堂比这要复杂一些,但是这给了我我需要的一切:)
解决方案
我们不应覆盖=运算符。如果我们隐式转换为诸如string或者int之类的类型,则让默认的相等运算符接管。
通常,如果我们需要自定义类的相等性,则应重写Equals(object)
方法。