Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 断言索引超出范围。必须为非负数且小于集合的大小_C# - Fatal编程技术网

C# 断言索引超出范围。必须为非负数且小于集合的大小

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])); 我觉得很奇怪,因为既然断言是真的,那么为什么还要对消息进行评估呢?还是我遗漏了什么?这个方法是正确的方法,没有像&&或|这样的短路语义。所有参数都将按顺序求值,除非其中一个参数引发异常在调用断言之前对消息求值

我有这个断言,即使计数为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#中的任何函数调用都是这样:首先计算所有参数,然后将计算结果传递给函数