C# 为什么在Excel中比较1<';或将任何数字与带有<;结果是真的吗?

C# 为什么在Excel中比较1<';或将任何数字与带有<;结果是真的吗?,c#,excel,vba,nullable,C#,Excel,Vba,Nullable,在Excel中1234>qwer=false,但1234

在Excel中
1234>qwer=false
,但
1234
。在C#中使用过可空类型之后,我希望在比较值与空值时,这两个语句都会返回类似的
false

这背后的理由是什么?它在什么地方有记录吗

我的第一个想法是Excel在内部将数字转换为字符串,然后比较字符串,但是:

'129<'11a=false
-当左侧部分作为文本输入时

129<'11a=true
-当左侧零件作为数字输入时

在VBA
variant
中,类型比较的工作方式与电子表格相同

Sub CompareNumberAndText()
    Dim a, b, c

    at = "129"
    an = 129
    b = "11a"
    ct = at < b 'false
    cn = an < b 'true
End Sub
子比较EnumberAndText()
尺寸a、b、c
at=“129”
an=129
b=“11a”
ct=在
我正在开发一个类似于Excel cell类型的库,并希望使行为尽可能接近Excel,但这些Excel比较结果是违反直觉的。在这种情况下,我会抛出一个错误或返回false

我可以想象一种假设情况,当我在a列中用两个数字除以某个值时,例如市盈率,但对于负的e,我加上“n.m.”。然后在B列中,我检查P/E是否>某个_值,我将为n.a.得出正确的结果。如果练习是寻找昂贵的股票,那么显示负收益的股票会有一些(但几乎没有)意义,并且可能有助于在有20只股票时进行进一步的手动逐个分析。但如果有2000个,我计算了一些总量,这可能会被忽略。

您可以参考

根据这一点,对于处的字符串比较
,第一个字符
1
的ASCII值为
49
,而
at
b
的ASCII值相同,但是第二个字符
2
的ASCII值大于
1
的ASCII值,因此表达式
at
return
false

另外,如中更详细的解释,如果您定义了行为发生更改的变量的基本类型,请参见下文

案例1:

子比较EnumberAndText()
在作为字符串时变暗,b作为字符串,c作为字符串,A作为整数
at=“120”
an=2
b=“1”
c=“3”
ct=在
案例2:

子比较EnumberAndText()
Dim at为字符串,b为字符串,A为整数
at=“120”
an=2
b=“1a”
ct=在

在案例1中,字符串
b
c
被转换为double,然后与
an
的值进行比较,结果得到正确的布尔值,但是在案例2中,程序无法将变量
b
转换为double值,并抛出错误
运行时错误-13,类型不匹配

复制Excel处理比较的方式不是一个简单的练习-您需要研究Unicode排序序列和区域设置。有关这些问题的一些讨论,请参见

此处不解释为什么变量类型的数字Sub CompareNumberAndText() Dim at As String, b As String, c As String, an As Integer at = "120" an = 2 b = "1" c = "3" ct = at < b 'false cn = an < b 'false kl = an < c 'true End Sub
Sub CompareNumberAndText()
    Dim at As String, b As String, an As Integer

    at = "120"
    an = 2
    b = "1a"
    ct = at < b 'false
    cn = an < b 'error
End Sub