错误CS8103:用户字符串太多–为什么起作用?

时间:2019-05-13 19:40:48

标签: c# .net compiler-errors roslyn

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>对象并对其进行调用,并返回其结果。

我很好奇。这到底发生了什么?如我所见,字符串文字的数量几乎相同,但是代码以某种方式进行编译。是否可以绕过此编译错误并在代码中添加任意数量的字符串文字?

0 个答案:

没有答案