C# 从文本运行时编译类时使用ValueTuple

C# 从文本运行时编译类时使用ValueTuple,c#,codedom,valuetuple,C#,Codedom,Valuetuple,我试图在运行时从文本编译一个类。我的问题是,我的类在函数(AllLines)中使用了valueTupe,并且在使用此代码时收到错误“C:\xxxx.cs(19,28):错误CS0570:“BaseClass.AllLines”不受语言支持 CodeDomProvider objCodeCompiler = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider(); CompilerParameters

我试图在运行时从文本编译一个类。我的问题是,我的类在函数(AllLines)中使用了valueTupe,并且在使用此代码时收到错误“C:\xxxx.cs(19,28):错误CS0570:“BaseClass.AllLines”不受语言支持

CodeDomProvider objCodeCompiler = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();

CompilerParameters objCompilerParameters = new CompilerParameters();

objCompilerParameters.ReferencedAssemblies.Add("mscorlib.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.IO.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Linq.dll");
CompilerResults objCompileResults = objCodeCompiler.CompileAssemblyFromFile(objCompilerParameters, filename);
编辑:

文本文件如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
namespace MyNamespace
{
    public abstract class BaseClass
    {
        public List<(int LineNumber, string Value)> AllLines
        {
            ...
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
名称空间MyNamespace
{
公共抽象类基类
{
公共列表所有行
{
...
}
}
}
我正在使用Microsoft.CodeDom.Providers.DotNetCompilerPlatform v2.0.0.0, Microsoft(R)Visual C#编译器版本1.0.0.50618


不确定这是否是roslyn的实际版本。

我认为这是因为您忘记了Methodos
AllLines()
:-)

首先,您使用roslyn的方式与使用NuGet软件包中的Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider一样正确

但是,您面临的问题是您的文本文件不包含有效的C

  • 将类型参数括在括号中时,
    List
    的声明无效
  • 您正在向类型参数声明(行号、值)添加名称(?)
  • List
    只接受一个类型参数时,您提供了两个类型参数。(也许你想用
    字典
  • 您的财产声明没有正文
  • 尝试将文本文件替换为:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    namespace MyNamespace
    {
        public abstract class BaseClass
        {
            public Dictionary<int, string> AllLines
            {
                get; set;
            }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    名称空间MyNamespace
    {
    公共抽象类基类
    {
    公共词典所有行
    {
    获得;设置;
    }
    }
    }
    

    注意,在本例中,实际上不需要
    使用System
    使用System.Linq
    。还要注意的是,您不需要使用Roslyn进行此操作。老式的CodeDOM可以编译它(用
    Microsoft.CSharp.CSharpCodeProvider
    替换
    Microsoft.CSharp.CSharpCodeProvider
    )。

    您能提供一个包括您正在使用的软件包版本在内的?(特别是,如果您使用的是Roslyn的旧版本,这肯定可以解释。)谢谢。完成后,请查看我的编辑。不确定这是否是我的roslyn版本。尝试那里的代码会产生完全不同的错误。这就是为什么我要求提供一个完整的示例—我们可以非常轻松地构建和运行它。@WynDiesel,您可以直接使用
    CodeDom
    ,而不是
    Roslyn
    @WynDiesel:这并不是真的疏忽—提出一个完整示例的过程通常可以解决问题:)不,上面提到的@DaisyShipton,代码不完整。该方法内部有一个get{}。明天我将编辑我的问题,以获得一个可用且完整的示例。谢谢你的回复,安迪。在第1点、第2点和第3点,C#7有一个称为命名元组的新特性,该特性与我的示例相同(请参阅)。关于第4点,您是正确的,在我的示例中,我没有提供属性的代码。这也不是我的问题。文件的代码符合要求,与实际代码没有问题。我还没有弄清楚问题出在哪里,根据你的建议,我最终使用了CodeDom。由于没有更好的答案,我将接受你的。