gpt4 book ai didi

c# - 当使用 Contract.Assert(true) 并且该方法必须返回某些内容时该怎么办?

转载 作者:太空狗 更新时间:2023-10-29 23:35:11 26 4
gpt4 key购买 nike

我有一些代码具有以下逻辑:

//pseudo-code
foreach (element in elementList) {
if (element is whatever)
return element;
}
}

理论上,总有一个元素是whatever,所以这个方法应该没有问题。无论如何,我在方法的末尾放置了一个断言只是为了确定:

//pseudo-code
foreach (element in elementList) {
if (element is whatever)
return element;
}
}

Contract.Assert(false, "Invalid state!");

问题是因为这个方法必须返回一些东西,而编译器不明白这个断言会中断程序的执行。在使用 Contracts 之前,在这种情况下,我曾经抛出一个 Exception,从而解决了问题。你将如何使用 Contract.Assert() 来处理这个问题?在 Contract.Assert() 调用后返回 null 或 default(element_type) 知道它永远不会被调用并关闭编译器?或者还有其他更优雅的方法吗?

谢谢

最佳答案

你可以去

var result = null;
foreach (element in elementList) {
if (element is whatever)
result = element;
break;
}
}

Contract.Assert(result != null, "Invalid state!");
return result;

它引入了一个中断,但它确实在返回周围看起来更干净。

会更干净

return elementList.Where( e => e is whatever).First();

按照@devoured 指出的那样进行编辑,上面的内容会覆盖整个列表

清洁无处

return elementList.First( e => e is whatever);

结束编辑

如果找不到任何东西,那只会爆炸。

但如果你真的想要断言,它可能是

var results = elementList.Where( e => e is whatever);
Contract.Assert(results.Count() == 1, "Boo");
return results.First();

但这也会迭代整个列表。

关于c# - 当使用 Contract.Assert(true) 并且该方法必须返回某些内容时该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2779091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com