VB.Net - كيفية دعم تحويل النوع الضمني بالإضافة إلى المساواة المخصصة

StackOverflow https://stackoverflow.com/questions/151318

  •  02-07-2019
  •  | 
  •  

سؤال

مُثَبَّت:انظر الملاحظات في الأسفل

أقوم بتنفيذ فئة عامة تدعم ميزتين، تحويل النوع الضمني وعوامل المساواة المخصصة.حسنًا، إنه يدعم المساواة أيضًا، إذا فعل ذلك.

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

يصلح (يحرر)

لقد بالغت في ما نفذته، لأنني لم أفهم ما كان يحدث.تتم المقارنة بين الأنواع الأساسية (أي سلسلة/مزدوجة/دليل) عبر عامل توسيع ctype(...) كمشغل سلسلة (أو دليل، إلخ).في النهاية، لقد قمت للتو بتنفيذ هذه الوظائف وما زالت جميع حالات الاختبار الخاصة بي تمر، بالإضافة إلى التعيين من الفصل إلى مثيل النوع الأساسي

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