【问题标题】:String.Split() method: compiler chooses wrong overloadString.Split() 方法:编译器选择了错误的重载
【发布时间】:2020-05-12 03:13:13
【问题描述】:

我有以下代码:

using System;

class Token
{
    static void Main()
    {
        Console.Write("Enter string to tokenize: ");
        string s = Console.ReadLine();
        Console.WriteLine("\nString length: {0}\n\nTokens:", s.Length);
        string[] tok = s.Split(' ', StringSplitOptions.RemoveEmptyEntries); //<-- this line causes CS1503
        //string[] tok = s.Split(); //works but also returns empty entries
        foreach (string i in tok)
            Console.WriteLine("{0}", i);
        Console.Write("\n{0} tokens found\nPress any key to continue . . . ", tok.Length);
        Console.ReadKey();
    }
}

代码应该从控制台输入中获取一个字符串并将其拆分为标记(由空格分隔)。我正在使用String.Split() 方法。默认情况下,此方法返回所有空标记(如果有多个连续的分隔符),这是我不想要的。根据MSDN,这个方法有一堆重载。不带参数的默认String.Split() 调用此重载:

public string[] Split(params char[] separator);

有一个不返回空标记的重载:

public string[] Split(char separator, StringSplitOptions options = System.StringSplitOptions.None);

据我了解,为了让它不返回空令牌,第二个参数必须是StringSplitOptions.RemoveEmptyEntries。所以直观的称呼方式是:

s.Split(' ', StringSplitOptions.RemoveEmptyEntries);

然而,编译器不这么认为,并向我抛出错误 CS1503:

CS1503: Argument 2: cannot convert from 'System.StringSplitOptions' to 'char'

所以很明显编译器没有选择我想要的重载。将鼠标悬停在函数调用上会使 IntelliSense 向我显示:

string[] Split(params char[] separator)

我应该如何调用String.Split() 来调用我想要的重载?

【问题讨论】:

  • 链接的文章是针对.net core的。只是为了确认一下,这是您的目标项目吗?
  • 第一个参数是char[], -> s.Split(new[]{' '}, StringSplitOptions.RemoveEmptyEntries);
  • Split(char, StringSplitOptions) 是在 .NET Core 2.0 中引入的。在那之前,最好的重载是Split(char[], StringSplitOptions),你可以称之为s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)。你的目标是什么?
  • 我认为 .net core 只是一套基本的 .net 框架,可以在更多平台上使用。它不应该在windows(.net framework 4.7.2)中编译吗?
  • 我认为您正在考虑.NET Standard(它定义了一组可在多个平台上使用的 API)。 .NET Core 实际上是一个新的(嗯,不再是新的)重写的运行时,它取代了 .NET Framework,同时还针对更多平台。自从上一版 .NET Framework 发布以来,.NET Core 中引入了很多东西。在下一个版本中,它将更名为 .NET 5。

标签: c# .net


【解决方案1】:

在 .NET Framework 中使用

char[] charSeparators = new char[] { ' ' };
string[] tok = s.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries);

在 NET 核心中(我在 2.2 中测试)。代码正在运行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多