سؤال

في VisualStudio (Pro 2008)، لاحظت للتو بعض السلوكيات غير المتسقة وتساءلت عما إذا كان هناك أي سبب منطقي وراء ذلك

في مشروع WinForms، إذا استخدمت الخط

if(myComboBox.Items[i] == myObject)

تلقيت تحذيرًا من المترجم بأنني قد أحصل على "مراجع محتملة غير مقصودة" أثناء قيامي بمقارنة كائن الكتابة بكتابة MyObject.عادلة بما فيه الكفاية.

ومع ذلك، إذا استخدمت بدلاً من ذلك واجهة للمقارنة بما يلي:

if(myComboBox.Items[i] == iMyInterface)

يختفي تحذير الترجمة.

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

يحرر في المثال الخاص بي، كان مربع التحرير والسرد مرتبطًا بقائمة، ولكن تم إنشاء هذه القائمة باستخدام list<IMyInterface>.Cast<MyObject>().ToList<MyObject>()

يبدو الأمر كما لو أن المترجم لا يزال يفترض أنني ملزم بقائمة IMyInterface.

(تم تغيير أساليب الكائن والواجهة لحماية الأبرياء)

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

المحلول

تحذير الترجمة للعينة الأولى هو أنه سيتم تجاهل أي عامل == مخصص لفصلك ومقارنة المراجع (ربما ليس ما قصدته، ومن هنا يأتي التحذير).

ليس من الممكن تحديد أنه يجب تجاوز عامل التشغيل على الواجهة، لذلك سيتم ذلك دائماً تكون مقارنة مرجعية.ليست هناك حاجة للتحذير لأنه يجب عليك دائمًا توقع ذلك.

فيما يلي مثال لتجاوز عامل التشغيل ==:

class Program
{
    static void Main(string[] args)
    {
        object t1 = new MyTest() { Key = 1 };
        MyTest t2 = new MyTest() { Key = 1 };

        Console.WriteLine((MyTest)t1 == t2); // Uses overriden == operator, returns true
        Console.WriteLine(t1 == t2); // Reference comparison, returns false
    }
}

public class MyTest
{
    public int Key { get; set; }

    public override bool Equals(object obj)
    {
        return this.Key == (obj as MyTest).Key;
    }

    public override int GetHashCode()
    {
        return this.Key.GetHashCode();
    }

    public static bool operator ==(MyTest t1, MyTest t2)
    {
        return t1.Equals(t2);
    }

    public static bool operator !=(MyTest t1, MyTest t2)
    {
        return !t1.Equals(t2);
    }

}

تعتبر فئة MyTest متساوية إذا كانت خاصية المفتاح متساوية.إذا كنت تريد إنشاء واجهة، فلا يمكنك تحديد أنها يجب أن تتضمن عامل تشغيل == مخصص وبالتالي ستكون المقارنة دائمًا مقارنة مرجعية (وبالتالي خاطئة في حالة نموذج التعليمات البرمجية الخاص بنا).

نصائح أخرى

لاجيرداليك,

يتم إنشاء التحذير لأنك تحتاج إلى إعادة العنصر من مجموعة العناصر مرة أخرى إلى النوع الأصلي الذي كان مرتبطًا بمربع التحرير والسرد، قبل المقارنة؛وإلا فقد تحصل على نتائج غير متوقعة كما يحذر المترجم.

هنا مثال:

myComboBox.DataSource = Collection<Car>;

لذا، إذا كان مربع التحرير والسرد مرتبطًا بمجموعة من سيارة الأشياء التي قد تعيدها قبل المقارنة:

if((car)myComboBox.Items[i] == thisCar)

ثم يجب أن لا تحصل على أي تحذيرات.

طريقة أخرى يمكنك القيام بها هي:

using(myComboBox.Items[i] as car){
 if(myComboBox.Items[i] == thisCar)
}

اسمحوا لي أن أعرف.حظ سعيد!سأذهب من الذاكرة، وآمل أنني لم أخطئ في كتابة أي شيء.:س)

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