请参阅下面的代码,了解我的困境。我有一个对象,其方法返回IList(CountChildren)中的项目计数,工作正常。但另一个做同样的事情但是接受泛型(CountGenericChildren)却没有。我在运行脚本的行上得到“System.NullReferenceException:对象引用未设置为对象的实例”(请参阅注释)。最后2个断言未执行。
我认为这与将泛型作为参数传递有关,但我对IronRuby的了解非常有限。任何帮助,将不胜感激。 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()
{
}
}
答案 0 :(得分:1)
这是一个IronRuby错误。要解决此问题,请将CountGenericChildren
方法更改为接收List
而不是IList
:
public int CountGenericChildren(List<ChildObject> c)
{
return c.Count;
}