.NET Core 3.1与.NET 6.0的区别

16

当Visual Studio 2022、C# 10和.NET 6.0发布时,我感到非常兴奋,于是下载并安装了社区版,并测试了一个正在进行的项目。我将目标框架更改为6.0并进行了清理构建。非常好,一切都按预期构建。

所以,继续向前发展并运行该项目。然而,第一个测试就失败了。我必须说我很惊讶。我开始四处寻找原因,并发现.NET Core 3.1和.NET 6.0之间存在差异。

下面是一个示例程序:

public class Program
{
    public static readonly string CTCPDelimiterString = "\x0001";
    public static readonly char CTCPDelimiterChar = '\x0001';

    public static void Main(string[] args)
    {
        string text = "!sampletext";

        Console.Write("  Using a char: ");
        if (text.StartsWith(CTCPDelimiterChar) && text.EndsWith(CTCPDelimiterChar))
        {
            Console.WriteLine("got CTCP delimiters");
        }
        else
        {
            Console.WriteLine("did not get CTCP delimiters");
        }

        Console.Write("Using a string: ");
        if (text.StartsWith(CTCPDelimiterString) && text.EndsWith(CTCPDelimiterString))
        {
            Console.WriteLine("got CTCP delimiters");
        }
        else
        {
            Console.WriteLine("did not get CTCP delimiters");
        }
    }
}

使用目标框架“netcoreapp3.1”,我得到了以下输出:

  Using a char: did not get CTCP delimiters
Using a string: did not get CTCP delimiters

使用目标框架为 'net6.0' 时,我得到了以下输出:

  Using a char: did not get CTCP delimiters
  Using a string: got CTCP delimiters
所以,我只能假设这是一个Unicode设置,但我无法在任何地方找到它(如果有的话)。我的理解是所有字符串都是UTF16,但为什么框架之间会有差异呢。
是的,我可以看到我的代码中的错误,它应该是一个字符,但使用"netcoreapp3.1"时它正常工作。
请问有人能解决这个问题吗?

12
事实上,在.NET Core 5(并且扩展到6)中引入了一项重大变更,它影响了Unicode文本处理。您可以在此处阅读有关详细信息:https://learn.microsoft.com/en-us/dotnet/standard/base-types/string-comparison-net-5-plus - Alejandro
4
谢谢提供链接,让我吓了一跳。我按照推荐的规则进行更改后,现在出现了138个错误和1813个警告!看来我要和代码共进午餐并解决这些问题了。 :) - Muz
这个回答解决了你的问题吗?string.IndexOf在.NET 5.0中返回不同的值 - Guru Stron
还有这个 - Guru Stron
2
这个问题的标题非常糟糕。强烈建议重新措辞以更具体明确。必须打开问题才能知道它是关于什么,这很糟糕,浪费了很多人的时间。 - julealgon
1个回答

2
在 .Net Core 3 之后,您必须使用 StringComparison 代码来突出显示比较模式。
更改
if (text.StartsWith(CTCPDelimiterString) && text.EndsWith(CTCPDelimiterString))

使用

if (text.StartsWith(CTCPDelimiterString, StringComparison.Ordinal) && text.EndsWith(CTCPDelimiterString, StringComparison.Ordinal))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接