Frage

Siehe den Code unten für mein Dilema. Ich habe ein Objekt mit einer Methode, die eine Anzahl von Elementen in einem Ilist (CountChildren) zurückgibt, das einwandfrei funktioniert. Aber ein anderer, der dasselbe tut, aber ein generisches (countgenericChildren) aufzunehmen. Ich erhalte "System.nullReferencexception: Objektreferenz nicht auf eine Instanz eines Objekts" in der Zeile, die das Skript ausführt (siehe Kommentare). Die letzten 2 Behauptungen werden nicht ausgeführt.

Ich glaube, das hat etwas mit dem Übergeben von Generika als Parameter zu tun, aber mein Wissen über IronRuby ist äußerst begrenzt. Jede Hilfe wäre geschätzt. 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()
        {
        }
    }
War es hilfreich?

Lösung

Das ist ein IronSruby -Fehler. Ändern CountGenericChildren Methode zu empfangen List Anstatt von IList:

public int CountGenericChildren(List<ChildObject> c)
{
  return c.Count;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top