ReSharper 5.x, HashSet Contains () и «Возможное« нулевое »назначение» - PullRequest
4 голосов
/ 08 декабря 2010

Этот код выводит True.

using System;
using System.Collections.Generic;

public class Default
{
    public static void Main(string[] args)
    {
        HashSet<string> foo = new HashSet<string>();
        foo.Add(null);
        Console.WriteLine(foo.Contains(null));
    }
}

В вызове null в моем вызове Contains () есть синяя заглушка со следующим предупреждением:

Возможное нулевое присвоение объекту, отмеченному атрибутом NotNull

Когда я приостанавливаю ReSharper, предупреждение исчезает.

Почему возникает это предупреждение?Учитывая, что я могу добавить NULL в HashSet, что мешает моему желанию проверить NULL в HashSet?

РЕДАКТИРОВАТЬ: .NET 3.5, VS2010

Ответы [ 2 ]

3 голосов
/ 08 декабря 2010

Я бы сказал, что это ошибка в Resharper.Тип HashSet<T> предназначен для обработки значений null.Это видно из изучения кода в отражателе.В частности, метод InternalGetHashCode, который имеет явную проверку для null и предоставляет хэш-код по умолчанию, равный 0.

Единственный случай, когда это может привести к возникновению проблемы, - для пользовательских IEqualityComparer<T> переданных экземпляров.до HashSet<T>, которые не учитывают значения null.Я бы сказал, что это довольно редко, хотя null проверки являются частью стандартного шаблона равенства для ссылочных типов в .Net.

Примечание: для ясности, я определенно не советую людям добавлять null в свою коллекцию.Я бы на самом деле поощрял обратное.Просто указав, что по какой-то причине HashSet<T> явно разрешает этот сценарий.

0 голосов
/ 08 декабря 2010

Я подозреваю, что это может быть, потому что метод HashSet<T>.Contains является реализацией ICollection<T>.Contains.

Другие реализации ICollection<T> могут не разрешать нули.

Независимо от того, так ли это, нет причины, по которой набор правил ReSharper не мог бы быть уточнен, чтобы не пометить это как потенциальную ошибку.

...