C# 断言索引超出范围。必须为非负数且小于集合的大小
我有这个断言,即使计数为0,它也会抛出一个错误C# 断言索引超出范围。必须为非负数且小于集合的大小,c#,C#,我有这个断言,即使计数为0,它也会抛出一个错误 Assert.IsTrue(list.Count==0,String.Format("It could not be opened for {0} topic, starting with {1}"list.Count,list[0])); 我觉得很奇怪,因为既然断言是真的,那么为什么还要对消息进行评估呢?还是我遗漏了什么?这个方法是正确的方法,没有像&&或|这样的短路语义。所有参数都将按顺序求值,除非其中一个参数引发异常在调用断言之前对消息求值
Assert.IsTrue(list.Count==0,String.Format("It could not be opened for {0} topic, starting with {1}"list.Count,list[0]));
我觉得很奇怪,因为既然断言是真的,那么为什么还要对消息进行评估呢?还是我遗漏了什么?这个
方法是正确的方法,没有像&&
或|
这样的短路语义。所有参数都将按顺序求值,除非其中一个参数引发异常在调用断言之前对消息求值。它是一个发送到IsTrue方法的参数,因此之前会调用string.Format。
没有一种神奇的实现会首先计算要断言的表达式,然后仅在需要时构建消息。
我觉得很奇怪,因为既然断言是真的,那么为什么还要对消息进行评估呢
因为IsTrue
是Assert类的一个方法。编译器计算这两个参数,然后将它们传递给函数。在调用函数之前,计算第二个参数失败。String.Format
在调用Assert.IsTrue()
之前执行-因此,如果列表为空,则无论Assert.IsTrue()
做什么,都会出现错误
注意,C#中的任何函数调用都是这样:首先计算所有参数,然后将计算结果传递给函数