문제

수정 : 하단의 메모를 참조하십시오

나는 암시 적 유형 변환 및 사용자 정의 평등 연산자의 두 가지 기능을 지원하는 일반 클래스를 구현하고 있습니다. 글쎄, 그것은 그렇게한다면 비등성도 지원합니다.

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

넓은 연산자에서 나는 약간의 반사를 수행하기 때문에 왼쪽의 문자열과 비교 또는 할당을 할 때 암시 적 변환을 문자열로 내려갈 수 있기를 원합니다.

A) SomeObject.StringPropertySetter = MyClass

고치다 (편집하다)

나는 무슨 일이 일어나고 있는지 이해하지 못했기 때문에 내가 구현 한 내용을 배 밖으로 나갔다. 기본 유형 (예 : String/Double/Guid) 간의 비교는 넓은 CType (...)를 문자열 (또는 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) 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top