是否应该有“未定义的操作”或“未定义的结果”?

时间:2011-01-08 21:07:24

标签: .net

几分钟前“Jon Skeet”找到了一些东西。 see this

这个问题和许多这样的问题让我想到了关于Undefined OperationUndefined Result的一些事情。

如果这些可能导致不同结果导致.netmono等库的不同实现的结果导致Undefined OperationUndefined Result?可能会抛出异常或在fieldstruct中设置class? 有Undefined OperationUndefined Result

的缺点和优点是什么?

另见this 我认为他们中的一些人提到了应该处理的意外结果或使程序员意识到这些结果。

我的意思是如何获得大量的知识“X正在以这种方式做某事”和“X如何实现另一件事”!这真的有助于编程和开发人员吗?

3 个答案:

答案 0 :(得分:4)

你的意思是抛出NotSupportedException吗?通过重言式,如果您定义操作将抛出异常或返回特殊值,则会定义您的行为。如果规范说明行为未定义,那么实现可以自由地执行实现者所希望的任何事情 - 强制执行它们抛出UndefinedOperation(或类似行为)意味着您的操作现在已定义!

对于您关联的案例:

已经指定将数字与NaN进行比较返回false(1<NaN1>NaN1==NaN都是假的?鉴于这些信息,当被问到“什么是最大的 - 1还是NaN?”我会回答“没有最大值,因此答案不是数字”(就像Math.Max那样)。但是,如果你把它称为“给定这些值 - 1,2,NaN - 这是最大的数字?”我不得不说“2” - 因为它是最大的数字(NaN不是数字!)

所以在这种情况下问题不在于操作根本没有定义 - 问题在于规范令人困惑!我同意NaN存在令人困惑的问题(以及无数其他事情),但这些都是争论规范需要清理或改变的地方。在我看来,您应该请求规范更改,或者可能是编译器警告 - 不是例外或特殊返回值。

答案 1 :(得分:1)

我看不出其他问题是如何适用的。操作的行为与文档一致,并且具有非常有用的语义,即使最初看起来不正确。我发现Philip Rieck的答案在解释为什么发生时是最明确的。在任何一种情况下,都不是未定义。

如果编译器希望发出“提示”或“警告”,那么它可以随意执行 - 请参阅当前的VS2010代码分析产品及其抱怨的内容。 (这是正常编译器警告的补充。)

虽然可以使用文档标记和/或自定义属性来扩充此代码分析,但使用此类方法可能是不明智的,因为如果在设计时“<问题”已知并且,则仅适用于编码到数据。以任何方式改变IL /结构以适应这种情况正在走下一条类似错误的道路。

就像代码中的其他内容一样 - 如果相信(或提供)的语义错误,则所有投注均已关闭。解决这个问题的唯一方法一般是测试,测试和更多测试 - 在一个完美的世界中,它将被阻止,永远不必被捕获;-)这与混淆{{没有什么不同1}}为“登录基地2”(不是)。

答案 2 :(得分:0)

嗯,在你引用的情况下,一个明确定义的标准,IEEE 754,Math.Max遵守它,而Enumerable.Max(this IEnumerable<double>)的实现却没有。至于基于标准实现代码,责任总是在实现者身上。