Calling overloaded methods

Hello,

C#
public class Cls {
public void foo(object a) {
Console.WriteLine(“foo #1”);
}
public void foo(object[] a) {
Console.WriteLine(“foo #2”);
}
}

Ruby:

Cls.new.foo(7)
Cls.new.foo([3, 4])

Output:
foo #1
foo #1 <-- Calling foo(object a) again

So how can I call foo(object[] a)?

  • Alex

You’ll need to build a CLR array rather than a Ruby array.

require ‘mscorlib’
System::Array.create_instance(System::Object.to_clr_type, 2)
o = System::Array.create_instance(System::Object.to_clr_type, 2)

o[0] = 3
o[1] = 4

You can monkey-patch Array and add this as a helper:

class Array
def to_clr_ary
o = System::Array.create_instance(System::Object.to_clr_type,
length)
each_with_index { |obj, i| o[i] = obj }
o
end
end

CLR arrays and Ruby arrays are totally different; Ruby arrays are much
more similar to “List” than to “object[]”. So it’s unlikely
that IronRuby would ever do this conversion automatically for you.

[3,4] is not an array of objects. It’s a RubyArray.

You can create a CLR array like this:

v = System::Array.of(Object).new(3)
[1,2,3].each_with_index { |x,i| v[i] = x }

Tomas

Thank you!