私が知る限り、矛盾はSystem.DateTime独自の == メソッドを定義し、定義してSystem.Int32いないためです。さらに、System.Int32は、IronRuby が に直接マップするという点で「特別な」クラスであるFixnumため、 を呼び出すとSystem.Int32 == x、実際には組み込みFixnum#==メソッドを呼び出していることになります。
それを念頭に置いて、次のことが起こります。
でInt32、これはにマップされますFixnum
x = System::Int32.MinValue # => -2147483648
x.class # => Fixnum
x == nil # => Fixnum == nil
which は何Int16にもマップせず、オーバーロードしません==
x = System::Int16.MinValue # => -32768 (Int16)
x.class # => System::Int16
x == nil # => Object == nil
DateTimewhich はマップされませんが、オーバーロードされます==
x = System::DateTime.Now # => 1/03/2010 9:00:47 a.m.
x.class # => System::DateTime
x == nil # System::DateTime == nil
オーバーSystem::DateTimeロードされたメソッドは、他の構造==のみを受け入れます。
その後、IronRubyはこれらの構造の 1 つに変換してメソッドを呼び出せるようにしようとしますが、表示されたエラーで失敗します。System::DateTime
nil
これは矛盾しているように見えますか? はい。
それは実際には矛盾していますか?私はノーと主張します。==独自のメソッドを定義する他のどの CLR 型よりも矛盾することはありません。私にとって、特別なケースがあるだけでは意味がありませんSystem::DateTime
一般的には、それは問題ではありません。ruby で null をチェックする「正しい」方法は、 を呼び出すことです。これは、または他のクラス/構造体.nil?でうまく機能しますDateTime