为什么Enumerable.Count()抛出`InvalidOperationException`将`null`转换为`bool`?

时间:2010-02-01 14:40:19

标签: c# .net ienumerable

任何人都可以解释以下声明如何生成

  

System.InvalidOperationException:值null不会被赋予System.Boolean类型的成员,因为它是一个值类型,其值不能为null(从瑞典语(see also)自由翻译)。

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

用户是用户,朋友是IEnumerable<User>

更新:好友从linq返回到sql调用,实际上是WhereSelectEnumerableIterator。在这种情况下它是空的,所以我曾期望上面评估为真。如果朋友不是空的,这种方法很好。因此,出于某种原因,当它出现空洞的情况下降时,很高兴知道原因,但我想我真正想问的是,解决方法是什么?

5 个答案:

答案 0 :(得分:8)

user.Friends是一个惰性评估的枚举(yield return或Linq查询),评估中的内容是抛出异常。没有更多的代码,就不可能确切地说出来。

答案 1 :(得分:3)

拆分代码行,看看报告的错误:

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

如果问题仍然不清楚,请分开第一行。

答案 2 :(得分:2)

正如我在对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;

在上面的吸气器中。

当别人付出努力时,我讨厌回答我自己的问题。感谢所有的投入!

答案 3 :(得分:0)

朋友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;
        }
    }

答案 4 :(得分:-2)

如果是列表,那么Count()似乎是错误的,那就是属性Count?你能证实一下吗?