проверенные элементы возможно непреднамеренное сравнение ссылок - PullRequest
0 голосов
/ 29 октября 2011

Я получил этот код, хотя он работает нормально, но он дает мне предупреждение (возможное непреднамеренное сравнение ссылок) по коду (st.staff_name == chk). Я озадачился, почему это так. Помощь будет оценена. Спасибо.

    private void buttonCreateSubmit_Click(object sender, EventArgs e)
    {
        Body body = new Body
        {
            body_content = richTextBoxBody.Text
        };

        tnDBase.AddToBodies(body);
        tnDBase.SaveChanges();

        var genid = tnDBase.Genres.Single(g => g.genre_name == comboBoxGenre.Text);

        Article article = new Article()
        {
            article_name = textBoxTitle.Text,
            genre_id = genid.genre_id,
            status_id = 3,
            body_id = body.body_id
        };

        tnDBase.AddToArticles(article);
        tnDBase.SaveChanges();

        if (checkedListBoxWriter.CheckedItems.Count != 0)
        {
            for (int x = 0; x <= checkedListBoxWriter.CheckedItems.Count - 1; x++)
            {
                var chk = checkedListBoxWriter.CheckedItems[x];
                var staf = tnDBase.Staffs.SingleOrDefault(st => st.staff_name == chk);
                WriterLog writerlog = new WriterLog()
                {
                    article_id = article.article_id,
                    staff_id = staf.staff_id
                };
                tnDBase.AddToWriterLogs(writerlog);
                tnDBase.SaveChanges();
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Вы получаете это предупреждение, потому что вы сравниваете string с object. Как и все пользовательские операторы, пользовательский оператор == для типа string (который сравнивает значение строки, а не то, имеют ли две строки равенство ссылок, что они могут не иметь) может только работают, когда оба операнда являются string ссылками.

Если вы знаете, что элементы в CheckedItems будут string s, просто приведите его к строке:

SingleOrDefault(st => st.staff_name == (string)chk);
0 голосов
/ 29 октября 2011

Я предполагаю, что он выдает предупреждение, потому что вы берете значение по умолчанию var chk = checkedListBoxWriter.CheckedItems[x]; и сравниваете его с элементом базы данных.Попробуйте задать конкретное значение var chk = checkedListBoxWriter.CheckedItems[x].Value; или введите chk в виде строки.

...