为什么这些陈述会产生相反的结果呢?

Lou*_*Lou 2 vb.net comparison

我正在尝试过滤一个对象列表,每个对象都有一个日历年作为其值之一.用户键入开始年份(例如1920年)和结束年度(1940年),并且将具有这两个值之间的年份的任何对象添加到列表中.因此,对于整个列表中的每个对象,我执行以下条件:

If _end >= _nList(i).Year > _start Then
     filterList.Add(_nList(i))
End If
Run Code Online (Sandbox Code Playgroud)

但是,这会返回false.但当我改变它时:

If _start < _nList(i).Year <= _end Then
      filterList.Add(_nList(i))
End If
Run Code Online (Sandbox Code Playgroud)

这评估为true,并运行代码._nList(i).Year是1928年,_start是1920年,_end是1940年.从逻辑上讲,这两个陈述应该是等价的:

1940 >= 1928 > 1920
1920 < 1928 <= 1940
Run Code Online (Sandbox Code Playgroud)

但出于某种原因,他们不是这种情况.我错过了什么?

the*_*tus 6

选项严格打开.它将解释这个问题.

If a < b < c Then
Run Code Online (Sandbox Code Playgroud)

它检查"a <b",它返回一个布尔值.然后将该布尔值与"<c"进行比较,这是不可能的.它会将"a <b"返回的布尔值转换为整数,然后将该值与"[converted Boolean] <c"进行比较.这不是你想要的,这个错误将与Option Strict On一起显示.

你需要分成两个比较.

If _end >= _nList(i).Year AndAlso _nList(i).Year > _start Then
Run Code Online (Sandbox Code Playgroud)

你的方式可能会用某种语言,但这不是vb.net的方式.

  • @Simo我没有说它不适用于任何语言.我只是感兴趣的地方. (2认同)