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