Использование C# Generics в качестве параметров метода в сценарии Ironruby
Вопрос
Смотрите код ниже для моей дилемы. У меня есть объект с методом, который возвращает подсчет элементов в Ilist (Countchildren), который работает нормально. Но еще один, который делает то же самое, но не входит в общий (CountGenericChildren), не так. Я получаю "System.NullReferenceException: ссылка на объект не установлен на экземпляр объекта" в строке, запускающем скрипт (см. Комментарии). Последние 2 утверждения не выполняются.
Я считаю, что это как -то связано с прохождением дженериков в качестве параметров, но мои знания о железной рубии чрезвычайно ограничены. Любая помощь будет оценена. C# v3.5, Ironruby v1.0
[Test]
public void TestIronRubyGenerics()
{
string script = null;
object val;
ScriptRuntime _runtime;
ScriptEngine _engine;
ScriptScope _scope;
_runtime = Ruby.CreateRuntime();
_engine = _runtime.GetEngine("ruby");
_scope = _runtime.CreateScope();
_scope.SetVariable("parentobject", new ParentObject());
// non-generic
script = "parentobject.CountChildren(parentobject.Children)";
val = _engine.CreateScriptSourceFromString(script, SourceCodeKind.Expression).Execute(_scope);
Assert.IsTrue(val is int);
Assert.AreEqual(2, val);
// generic - this returns correctly
script = "parentobject.GenericChildren";
val = _engine.CreateScriptSourceFromString(script, SourceCodeKind.Expression).Execute(_scope);
Assert.IsTrue(val is IList<ChildObject>);
// generic - this does not
script = "parentobject.CountGenericChildren(parentobject.GenericChildren)";
val = _engine.CreateScriptSourceFromString(script, SourceCodeKind.Expression).Execute(_scope);
Assert.IsTrue(val is bool);
Assert.AreEqual(2, val);
return;
}
internal class ParentObject
{
private IList<ChildObject> list;
public ParentObject()
{
list = new List<ChildObject>();
list.Add(new ChildObject());
list.Add(new ChildObject());
}
public IList<ChildObject> GenericChildren
{
get
{
return list;
}
}
public IList Children
{
get
{
IList myList = new System.Collections.ArrayList(list.Count);
foreach(ChildObject o in list)
myList.Add(o);
return myList;
}
}
public int CountGenericChildren(IList<ChildObject> c)
{
return c.Count;
}
public int CountChildren(IList c)
{
return c.Count;
}
}
internal class ChildObject
{
public ChildObject()
{
}
}
Решение
Это ошибка Ironruby. Чтобы обезумно, изменить CountGenericChildren
метод для получения List
вместо IList
:
public int CountGenericChildren(List<ChildObject> c)
{
return c.Count;
}