Ошибка CS8103: слишком много пользовательских строк. Почему это работает? - PullRequest
0 голосов
/ 13 мая 2019

Существует модульный тест в проекте Roslyn .NET Compiler, который показывает, как воспроизвести следующую ошибку:

CS8103 Общая длина пользовательских строк, используемых программой, превышает допустимый предел. Попробуйте уменьшить использование строковых литералов

Однако я изменил тест, чтобы он выглядел так:

using System;
using System.IO;

namespace TooManyUserStringsTest
{
class Program
{
    static void Main(string[] args)
    {
        var builder = new System.Text.StringBuilder();
        builder.Append(@"
        using System;
        public class A
    {
    ");

        Boolean stringFunction = false; // <-- Attention here

        for (int i = 0; i < 9; i++)
        {
            if (i == 0)
            {
                if (stringFunction)
                {
                    builder.Append("public static string returnString() {");
                    builder.Append("Func<string> str = () => \"");
                    builder.Append((char)('A' + i), 1000000);
                    builder.Append("\";");
                    builder.Append("return str(); }");
                    builder.Append("public static void Method () {");
                    builder.Append("System.Console.WriteLine(returnString());");
                }
                else
                {
                    builder.Append("public static void Method () {");
                    builder.Append("System.Console.WriteLine(\"");
                    builder.Append((char)('A' + i), 1000000);
                    builder.Append("\");");
                    builder.AppendLine();
                }
            }
            else
            {
                builder.Append("System.Console.WriteLine(\"");
                builder.Append((char)('A' + i), 1000000);
                builder.Append("\");");
                builder.AppendLine();
            }
        }

        builder.Append(@"
            }
    }
    ");

     File.WriteAllText("TooManyUserStrings.cs", builder.ToString());
    }
}

}

Когда вы создаете проект VS с этим кодом и выполняете его, он создает файл TooManyUserStrings.cs внутри проекта. Затем, если вы попытаетесь выполнить его снова, вы получите указанную ошибку.

Однако, если вы удалите созданный файл, измените stringFunction на true и повторите тест, код компилируется без ошибок. Если вы проанализируете сгенерированный код, вы увидите, что я только что переместил первую длинную строку во внешнюю статическую функцию, которая создает объект Function<string> и вызывает его, возвращая его результат.

Мне любопытно. Что здесь только что произошло? На мой взгляд, количество строковых литералов примерно одинаково, но код как-то компилируется. Можно ли обойти эту ошибку компиляции и добавить столько строковых литералов, сколько я хочу в моем коде?

...