سؤال

إذا قمت بتشغيل التعليمات البرمجية التالية تحصل على الإخراج:

الجواب هو:u003Cbr>
u003Cbr>

class Program
{
    static void Main(string[] args)
    {
        HtmlElement element = new HtmlElement();
        element.InnerHtml = "<br>";

        string val = element.InnerHtml != null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName;
        Console.WriteLine("The answer is: "+val); // correct
        Console.WriteLine("The answer is: " +element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?
        Console.ReadLine();

    }
}
public class HtmlElement
{
    public string InnerHtml { get; set; }
    public string InnerText { get; set; }
    public string TagName { get; set; }
}

ما حدث للسطر الثاني، الذي من المتوقع أن يكون:

الجواب هو:u003Cbr>

فقط للتوضيح على الجواب لأي أتساءل سيرفر:

Console.WriteLine("The answer is: " +element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?

يتم تقييمها كما

Console.WriteLine(("The answer is : " + element.InnerHtml != null) ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?
هل كانت مفيدة؟

المحلول

لك The answer is: " +element.InnerHtml لها الأسبقية على != null.

إعادة كتابة باسم:

Console.WriteLine("The answer is: " + (element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName)); // bug?

(أضف قوس)

نصائح أخرى

إنها مشكلة الأسبقية. البيان الخاص بك:

"The answer is: " + element.InnerHtml !=null ? element.InnerHtml : ...

يجب تقييمها على النحو التالي:

"The answer is: " + (element.InnerHtml !=null ? element.InnerHtml : ...)
                    <------------------- this first ------------------->

ولكن في الواقع تقييم على النحو التالي:

("The answer is: " + element.InnerHtml) !=null ? element.InnerHtml : ...
<------------- this first ------------>

هذا التعبير الأخير سيكون دائما صحيحا، منذ "string" + anything != null, ، لذلك سوف تحصل دائما على فقط element.InnerHtml (<br>).

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

جانبا، أحب الطريقة التي يبدو أن الناس يفترضون أنهم وجدوا خطأ في قطعة من البرامج المستخدمة من قبل ملايين الآخرين من الآخرين، بدلا من النظر في أدنى احتمال أنهم قد فعلوا خطأ ما :-)

على الرغم من أن نكون صادقين، فقد وجدت الأخطاء في منتج واحد يستخدمه العديد من الأشخاص (مترجم Microsoft Cobol إذا كنت أتذكر بشكل صحيح)، لكن ذلك كان بسبب المشكلات الموقعة / غير الموقعة وكان لدي واحدة من الآلات الأولى للغاية مع أكثر من 512 ألف رام ( حيث يتم التحقق من رمز بدء التشغيل للتأكد من أن لديك ذاكرة كافية ومعالجتها 640 كيلو بايت كأحد المبلغ السلبي).

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

لأن لا أحد أجاب مع ?? بعد:

Console.WriteLine("The answer is: " + ( element.InnerHtml ?? 
     element.InnerText ?? element.TagName ) );

الذي يحتاج نفس الزوج من اضافية () كما ?: مقاربة.

السبب في أن اثنين من الكتابين يكتبون نتائج اختصار هو علة خفية في منطقك. (تختلف قواعد الأسبقية عن ما تتوقعه، كما هو مذكور في مكان آخر)

الخط:

string val = element.InnerHtml != null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName;

يقيم إذا كان Element.Innerhtml يختلف عن NULL حيث يكون الخط:

Console.WriteLine("The answer is: " +element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?

يقيم ما إذا كان "الجواب هو:" + element.innerhtml يختلف عن null، والذي لن يكون أبدا، لذلك ستكون النتيجة دائما entement.innerhtml (والنص "النص" هو جزء من التعبير المنطقي و وبالتالي لن يتم طباعتها)

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