Почему Enumerable.Count () выбрасывает InvalidOperationException для преобразования `null` в` bool`? - PullRequest
2 голосов
/ 01 февраля 2010

Может кто-нибудь объяснить, как на земле следующее утверждение может генерировать

System.InvalidOperationException: значение null не может быть назначено члену типа System.Boolean, поскольку это тип значения, который не может иметь значение null (свободно переводится с шведского ( см. Также )).

if (user.Friends.Count() == 0)

пользователь - это пользователь, а друзья - это IEnumerable<User>.

Обновление: Друзья возвращаются из вызова linq to sql и на самом деле WhereSelectEnumerableIterator. Это пусто в этом случае, поэтому я ожидал, что вышеизложенное оценит как истинное. В случаях, когда Друзья не пустые, это работает нормально. Так что по какой-то причине, когда опустошается пустое хаос, было бы неплохо знать почему, но я думаю, что я действительно спрашиваю, какой обходной путь?

Ответы [ 5 ]

8 голосов
/ 01 февраля 2010

user.Friends - это перечисление с ленивой оценкой (yield return или запрос Linq), и что-то внутри оценки вызывает исключение. Без большего количества кода невозможно сказать точно, где.

3 голосов
/ 01 февраля 2010

Разделите строку кода и посмотрите, какая ошибка сообщается:

int temp = user.Friends.Count();
if (temp == 0)

Затем разделите первую строку, если проблема все еще неясна.

2 голосов
/ 02 февраля 2010

Как я написал в комментарии к 280Z28, геттер выглядит следующим образом.

    public IEnumerable<User> Friends
    {
        get
        {
            var friends = from u2g in FriendUserGroup.User2GroupLinks
                           select u2g.User;
            return friends;
        }
    }

FriendUserGroup.User2GroupLinks является EntitySet. Свойство Count - это то, что вызывает исключение. Любой () также будет, если кому-то интересно. Вместо этого вам нужно проверить HasLoadedOrAssignedValues. Поэтому я вставил

if (!FriendUserGroup.User2GroupLinks.HasLoadedOrAssignedValues)
    return null;

в получателе выше.

Я ненавижу отвечать на свой вопрос, когда другие люди прилагают усилия. Спасибо за все комментарии!

0 голосов
/ 01 февраля 2010

Похоже, что Друзья IEnumerable не были инициализированы. Например, приведенный ниже фрагмент кода не выдает ошибку времени выполнения, потому что в Main () я установил для Friends общий список.

public sealed class Program
    {
        public static void Main()
        {
            var user = new User
                           {
                               Friends = new List<Int32>()
                           };

            if (user.Friends.Count() == 0)
            {
                // TODO: Input logic here
            }
        }
    }

    /// <summary>
    /// User class
    /// </summary>
    public class User
    {
        /// <summary>
        /// Gets or sets the friends.
        /// </summary>
        /// <value>The friends.</value>
        public IEnumerable<Int32> Friends
        {
            get; set;
        }
    }
0 голосов
/ 01 февраля 2010

Если это список, то Count() представляется неправильным, это будет свойство, т.е. Count? Вы можете это подтвердить?

...