据我所知,这种不一致是因为
System.DateTime
定义它自己的==方法,并
System.Int32
没有。
System.Int32
是一个“特殊”类,IronRuby将其直接映射到
Fixnum
,所以当你打电话的时候
System.Int32 == x
,您实际上是在调用内置
Fixnum#==
方法。
考虑到这一点,以下是发生的情况:
具有
Int32
菲克努姆
x = System::Int32.MinValue # => -2147483648
x.class # => Fixnum
x == nil # => Fixnum == nil
Int16
它不会映射到任何东西,也不会过载
==
x = System::Int16.MinValue # => -32768 (Int16)
x.class # => System::Int16
x == nil # => Object == nil
具有
DateTime
做
超载
==
x = System::DateTime.Now # => 1/03/2010 9:00:47 a.m.
x.class # => System::DateTime
x == nil # System::DateTime == nil
这个
System::DateTime
==
系统::日期时间
IronRuby然后尝试转换
nil
调用这些结构中的一个,以便调用该方法,然后该方法将失败,并出现您看到的错误。
这看起来不一致吗?对
事实上是不一致的吗?我认为没有。好吧,没有比任何其他定义它自己的CLR类型更不一致的了
系统::日期时间
但总的来说,这并不重要。在ruby中检查null的“正确”方法是调用
.nil?
,这与
或任何其他类/结构