سؤال

عند تحويل مشروع (حيث تم استخدام أسلوب قالب IComparable عدة مرات) من VS 2005 إلى VS 2008، ظهرت لي بعض الأخطاء:

Error 12 Type argument 'Object' does not inherit from or implement 
the constraint type 'System.IComparable'.

هل هذه حقيقة فعلية أن System.Object لم يعد يطبق تلك الواجهة، أو أن هناك خطأ ما حدث أثناء التحويل؟هل يمكنني إصلاح هذا بطريقة أو بأخرى؟

المشكلة تكمن في الطريقة التالية:

Public Function ValueIn(Of T As IComparable)(ByVal pValue As T, ByVal ParamArray pArgs() As T) As Boolean
    For Each MyArg As T In pArgs
        If pValue.CompareTo(MyArg) = 0 Then
            Return True
        End If
    Next
    Return False
End Function

وحتى شيء بسيط مثل:

Dim a as Object = 1
ValueIn(a,1,2)

يسبب الخطأ المذكور أعلاه.لقد عملت بشكل مثالي في VS 2005، فما هي المشكلة الآن؟

هل كانت مفيدة؟

المحلول

يحرر: لقد قمت للتو بتجربة الكود الخاص بك في كل من VS 2005 و 2008.

لديك Option Strict Off تم تكوينه في مشروعك أو ملف التعليمات البرمجية المصدر.لم يعمل الرمز الخاص بك مطلقًا في المقام الأول، وإذا قمت بتعيينه Option Strict On في VS 2005، ستشاهد السبب الحقيقي للخطأ، وهو "فشل استنتاج وسيطة النوع لمعلمة النوع 'T'".أوصي بذلك Option Strict On يمكن استخدامها في كافة التعليمات البرمجية VB.NET.

ترى خطأ مختلفًا في VS 2008 لأنه يستخدم إصدارًا أحدث من اللغة، مع قواعد تحميل زائد واستدلال كتابة مختلفة تمامًا.في VB.NET 2008، لا يمكن للمترجم حل استدعاء الأسلوب بغض النظر عما إذا كان Option Strict قيد التشغيل أو إيقاف التشغيل.

ال System.Object النوع لا ولم يطبق أي واجهة على الإطلاق.

إعداد Option Infer في VS 2008 ليس ذا صلة بالرمز الخاص بك لأنه لا يستخدم أي أنواع مستنتجة.

إن أبسط طريقة لإصلاح الخطأ في كلا IDEs هي تغيير رمز الاتصال على النحو التالي:

    Dim a As Integer = 1
    ValueIn(a, 1, 2)

نصائح أخرى

إذا قمت بتشغيل التصحيح رمز في Visual Studio 2005 سترى أن لمن

وخافت على أنه كائن = 1

وهو عدد صحيح ولكن إذا كنت تستخدم 2008 سوف يعلن أنه هو كائن.

وصحيح أن يكون واجهة IComparable impelemented ولكن ليس الكائن. اذا مالعمل؟ الجواب: حصلت على خصائص المشاريع (انقر بالزر الأيمن على اسم المشروع وحدد خصائص)، الذهاب في إطار "ترجمة" ويوجد لدينا الآن باستثناء صريح، صارمة ومقارنة، إن كان لديك في عام 2005، وهو حقل جديد يسمى يستنتج. تغيير تلك القيمة.

والآن نحن عبر أصابعنا أن هذا العمل.

وكان System.Object IComparable؟ كيف تعمل؟ IEquatable أستطيع أن أفهم ولكن IComparable لا معنى له.

هل قمت بتوسيع على "طريقة قالب"؟ ربما هذا هو أدنى فكرة.

وأنا متأكد 99٪ ويتسبب هذا عن تغيير في صافي 3.5 مع IComparable فئة القالب. لقد رأيت بضعة أمثلة. NET السابقة التي تعمل بشكل جيد ولكن إنشاء الأخطاء في 3.5.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top