Domanda

Si veda il codice qui sotto per il mio dilemma. Ho un oggetto con un metodo che restituisce un conteggio di elementi in un IList (CountChildren), che funziona bene. Ma un altro che fa la stessa cosa, ma tenendo in un generico (CountGenericChildren) non lo fa. Ottengo "System.NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto" sulla linea che esegue lo script (vedi commenti). Gli ultimi 2 afferma non vengono eseguiti.

Credo che questo abbia a che fare con il passare generici come parametri, ma la mia conoscenza di IronRuby è estremamente limitata. Qualsiasi aiuto sarebbe apprezzato. C # v3.5, v1.0 IronRuby

    [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()
        {
        }
    }
È stato utile?

Soluzione

Questo è un bug IronRuby. Per risolvere essa, cambiare il metodo di CountGenericChildren di ricevere List invece di IList:

public int CountGenericChildren(List<ChildObject> c)
{
  return c.Count;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top