繁体   English   中英

使用Roslyn June CTP 2012生成动态LINQ时出错

[英]Error in generating a dynamic LINQ using Roslyn June CTP 2012

有时我写了一个使用Mono编译器作为服务的程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mono.CSharp;

namespace MonoTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Initializing the evaluator
            Evaluator.Init(new string[0]);           

            //Importing namespaces 
            Evaluator.Run("using System;");
            Evaluator.Run("using System.Linq;");
            Evaluator.Run("using System.Collections.Generic;");

            //Sum of 'n' numbers
            Evaluator.Run("List<int> numbers= new List<int> {1,2,3,4,5,6,7,8,9,10} ;");
            Evaluator.Run("var sum = numbers.Sum();");
            Evaluator.Run("Console.WriteLine(sum);");
        }
    }
}

//输出

55

现在尝试使用Roslyn (我的第一个代码)进行相同的操作[Roslyn项目类型:控制台应用程序]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Roslyn.Scripting;
using Roslyn.Scripting.CSharp;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new ScriptingHost();
            string codeLine = string.Empty;
            codeLine += "List<int> numbers= new List<int> {1,2,3,4,5,6,7,8,9,10} ;" + Environment.NewLine;
            codeLine += "var sum = numbers.Sum();";
            codeLine += "Console.WriteLine(sum);";

            var res = host.Execute(codeLine);

            //Write the result back to console
            if (res != null)
                Console.WriteLine(" = " + res.ToString());

            Console.ReadKey();

        }
    }

    public class ScriptingHost
    {
        private ScriptEngine engine;
        private Session session;       

        public ScriptingHost()
        {
            //Create a session
            session = Session.Create(this);

            //Create the engine, just pass the assemblies and namespaces
            engine = new ScriptEngine(new Assembly[]
                                {
                                    typeof(Console).Assembly,
                                    typeof(ScriptingHost).Assembly,
                                    typeof(IEnumerable<>).Assembly,
                                    typeof(IQueryable).Assembly
                                },
                                new string[] 
                                { 
                                    "System", "System.Linq", 
                                    "System.Collections",
                                    "System.Collections.Generic"
                                }
                            );

        }

        //Pass the code to the engine, nothing much here
        public object Execute(string code)
        {
            return engine.Execute(code, session); --Error at this line
        }
    }
}

但是得到这个错误

“(1,34):错误CS8000:该语言功能('带有初始化程序的对象创建表达式')尚未在Roslyn中实现。”

请帮忙

看起来您将不得不分开创建列表和填充列表:

codeLine += "List<int> numbers= new List<int>();";
codeLine += "var values = new int[] {1,2,3,4,5,6,7,8,9,10};";
codeLine += "numbers.AddRange(values);";

编辑:或使用构造函数重载,重载采用 @svick在注释中建议的列表

codeLine += "var numbers = new List<int>(new int[] {1,2,3,4,5,6,7,8,9,10});";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM