我正在调试一些代码,并遇到了这种奇怪的情况。方法采用String[]
变量,它首先检查变量是否为 null ...
protected override CommandResult OnExecute(DateTime closeOfBusinessDate,
string[] verbs)
{
if (verbs == null)
{
throw new ArgumentNullException("verbs");
}
我们通过这一行,然后检查它以确保变量只有一个值......
if (verbs.Count() > 1)
{
throw new ArgumentException("Only single verb supported.", "verbs");
}
这是非常基本的东西,但在调试过程中,我看到了这个结果......
正如您所看到的,Count()
1 ,但if (verbs.Count() > 1)
的检查仍然评估为真,有人可以解释一下吗?也许我错过了一些明显的东西。
编辑:添加了输出
您可以在输出窗口中看到值 1 。
答案 0 :(得分:0)
请考虑以下代码:
static void Example()
{
var verbs = new string[] { null, null };
checkBerbs(verbs);
}
static void checkVerbs(string[] verbs)
{
if (verbs.Count() > 1)
{
mutateArray(ref verbs); //this would run another thread --> race condition
throw new ArgumentException();
}
}
private static void mutateArray(ref string[] verbs)
{
verbs = new string[] { null };
}
这是一种可能的情况。不知道你的代码的全部范围,我不确定这是否可行。显然mutateArray
将在另一个线程上运行,你会遇到竞争条件。也许锁定verbs
可以让你知道这是一些并发问题。
答案 1 :(得分:0)
如果代码实际上正在调用Enumerable.Count
扩展方法并且没有任何技巧,那么问题是您假设要执行的下一个语句是throw
语句。
这两种情况最有可能导致调试器出现位于一个位置,即使它不是:
使用调试配置重新编译或运行代码可能会显示实际未达到throw
语句。
答案 2 :(得分:-1)
伯爵并没有这样的工作。请改用verbs.Length
答案 3 :(得分:-4)
我不确定我能告诉你为什么会看到这个结果,但我可以建议修复:使用verbs.Length而不是verbs.Count()。在这种情况下,Count()是一个LINQ方法,而Length是一个数组属性,它将告诉你数组中的项目数。