2

当这个比较失败时,我最近遇到了一个障碍:

System.Version compareVersion = new Version(2, 0, 0, 0);
System.Version actualVersion = new Version(2, 0);

if(actualVersion >= compareVersion) // returns false

我了解它背后的实现机制,因为最后两位数被初始化为 -1 并且 -1 小于 0。

但是:它背后的理由是什么?从数学的角度来看,无论我附加多少个零,1 和 1.0 和 1.000000 之间没有区别。

4

2 回答 2

1

根据文档

“内部版本号的差异表示对同一源代码的重新编译。当处理器、平台或编译器发生变化时,可能会使用不同的内部版本号。”

构造函数的第三个参数是构建号,如果在构建 Version 对象时未分配,则将其初始化为 -1。可以想象,可以在第一次构建一个或多个程序集之前创建一个版本对象,例如在某些构建管道逻辑中。一旦构建了程序集并且存在内部版本号,具有内部版本号的新版本对象将继承没有版本的版本。

由于“大于”和“小于”运算符重载实际上是关于确定构建的相对时间(即一个版本是早于还是晚于另一个版本),所以从未构建或修订过的版本“小于”具有.

于 2015-11-20T09:54:51.733 回答
1

这是我的看法。我可能完全错了,但正如你所问的理由,这就是我看到版本号及其使用的方式。

版本号实际上并不是数字,它们实际上只是具有一些语义和基于该语义的比较逻辑的标识符。该逻辑的一部分是能够检查两个版本是否兼容。

从这个意义上说,2.0代表任何2.0衍生物,或2.0.*.*。当您将关系运算符与版本一起使用时,您实际上想要回答兼容性问题,其中的>=意思是is backwards compatible with.

所以,V1 >= V2意思是is V1 backwards compatible with V2

  • 2.0.0.0 >= 2.0.*.*-> true,2.0.0.0应该能够在支持声称支持的系统上运行2.0.*.*
  • 2.0.*.* >= 2.0.0.0-> false,因为并非每个2.0.*.*版本都保证兼容2.0.0.0

[编辑:回答评论]

那么2.0.*.*至少不应该等于2.0.0.0?因为(用你的话来说)“2.0.0.0应该能够在支持声称支持的系统上运行2.0.*.*

我认为让您感到困惑的是,我们选择2.0.0.0了直观地理解为基本版本的版本,因此在逻辑上等同于2.0.*.*,但事实并非如此。

它不应该相等,因为2.0.*.*任何2.0 版本(不仅仅是选择的特定版本),因此ANY_20_VERSION == 2000_VERSION错误的。换句话说,这意味着任何2.0导数都应该能够满足关系(不仅仅是选择的特定关系),并且显然2.0.0.12.0.0.0

于 2015-11-20T10:09:59.950 回答