当这个比较失败时,我最近遇到了障碍:
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之间都没有差别.1000000。
答案 0 :(得分:1)
根据docs
“内部版本号的差异表示对同一源代码的重新编译。当处理器,平台或编译器发生更改时,可能会使用不同的内部版本号。”
构造函数的第三个参数是构建号,如果在构造Version对象时未分配,则构建号初始化为-1。可以想象,可以在第一次构建组件或组件之前创建Version对象,例如在一些构建管道逻辑中。构建程序集并且存在内部版本号后,具有内部版本号的新版本对象将成功启动版本。
由于“大于”和“小于”运算符重载实际上是关于确定构建的相对时间(即一个版本是否早于或后一个版本),从未构建或修改过的版本“小于”a版本有。
答案 1 :(得分: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.*.*
- >是的,因为2.0.0.0
应该能够在支持声称支持2.0.*.*
2.0.*.* >= 2.0.0.0
- >是的,因为不是每个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.1
与2.0.0.0
不一样