Как кодировать двусмысленные кавычки при использовании CSharpSyntaxTree.parseText (Roslyn)

#c# #verbatim-string

Вопрос:

Я пытаюсь использовать компилятор Roslyn для динамического создания сборки и класса.

Когда я вызываю Emit, я получаю и ошибку о значении в двойных кавычках в базовом конструкторе в следующем:

Как я должен кодировать двойные кавычки в строке, в которую я передаю ParseText ?

 var syntaxTree = CSharpSyntaxTree.ParseText(@"using System;
            using System.Linq;
            using Xxx.Operators;

            namespace Xxx.Operators
            {
                public sealed class DuplicateOperator : Operator
                {
                    public DuplicateOperator() : base(""Sub"")
                    {
                    }

                    public override long Execute(params Func<long>[] operands)
                    {
                        var firstValue = operands.First()() * 2;
                        return operands.Aggregate(firstValue, (a, b) => a - b());
                    }
                }
            }");
 

Ошибка возникает при вызове Emit в следующем коде, если я заменю значение qoted (Sub) выше чем-то вроде строки.Пустой, тогда выброс будет успешным.

 var references = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic)
                .Select(a => a.Location)
                .Distinct()
                .Select(l => MetadataReference.CreateFromFile(l))
                .ToArray();

            var compilation = CSharpCompilation.Create("Xxx.DynamicOperator", new []{syntaxTree}, references,  new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            using var ms = new MemoryStream();
            var result = compilation.Emit(ms);
            if (result.Success)
            {
                ms.Seek(0, SeekOrigin.Begin);
                Assembly assembly = Assembly.Load(ms.ToArray());
            }
 

Комментарии:

1. Или "The quote " in normal string" или @"The quote "" in verbatim string" . Ваш вопрос не имеет отношения к Рослин. Это просто проблема синтаксиса C#.

Ответ №1:

Двойные двойные кавычки используются для представления двойной кавычки в дословной строке:

Только escape-последовательность кавычек ( "" ) не интерпретируется буквально; она создает одну двойную кавычку

Поэтому вам следует просто удалить :

 @"
....
public DuplicateOperator() : base(""Sub"")
...
"