There's a unit test在Roslyn .NET编译器项目上,该项目显示了如何重现以下错误:
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>
对象并对其进行调用,并返回其结果。
我很好奇。这到底发生了什么?如我所见,字符串文字的数量几乎相同,但是代码以某种方式进行编译。是否可以绕过此编译错误并在代码中添加任意数量的字符串文字?