【问题标题】:C# error: operator '!=' cannot be applied to operands of type 'char' and 'string'C# 错误:运算符 '!=' 不能应用于 'char' 和 'string' 类型的操作数
【发布时间】:2013-03-02 09:07:46
【问题描述】:

今天,根据一本书的教程(字面意思),我遇到了一个意外错误:

operator '!=' cannot be applied to operands of type 'char' and 'string'

在这部分代码中:

public void displayFullName()
{
    StringBuilder FullName = new StringBuilder();

    FullName.Append(firstName);
    FullName.Append(" ");
    if (middleName[0] != "") //ERROR occurs here
    {
        FullName.Append(middleName[0]);
        FullName.Append(". ");
    }
    FullName.Append(lastName);

    Console.WriteLine(FullName);
}

当然 middleName 被声明为:

    class Person
{
    private string firstName;
    private string middleName; //obiously declared as string
    private string lastName;
    private int age;
(...the rest of code...)

那么,问题是如何解决这个错误?

【问题讨论】:

  • 这本书的名字和作者是什么?
  • @Virtlink 旧书,ISBN: 0-672-32071-1

标签: c# string char operators


【解决方案1】:

那么,问题是如何解决这个错误?

这取决于您要达到的目标。让我们看看有问题的行:

if (middleName[0] != "")

您真正想在这里确定什么?询问middleName 的第一个字符(middleName[0] 返回的内容)是否为空字符串是没有意义的。如果您一直在检查它是否等于“X”(或其他单字符串),那么我可能认为您想要if (middleName.StartsWith(...))

但如果您实际上只是想找出middleName 是否不为空,您可以使用:

if (middleName != "")

或者如果middleName 也可以为空并且您想要检测到,您可能想要:

if (!string.IsNullOrEmpty(middleName))

事实上,如果middleName 为空,那么middleName[0] 会抛出IndexOutOfRangeException

作为一个附带问题 - 除非这真的是一次性的,否则它建议你应该找一本不同的书。虽然错误可能会漏掉,但你真的,真的应该能够期望书中的代码能够编译(除非它试图证明失败)。你可能想编辑你的问题来命名和羞辱有问题的书:)(它在 C# 中使用 displayFullName 的方法名称和 FullName 的变量名称这一事实也有点该死。)

【讨论】:

  • 实际上,如果您仔细查看代码,您可以看到作者尝试确定 middleName 是否不为空,因此 if (middleName == "") 可能不好但这是好的: (middleName != "") 无论如何,谢谢你的详细分析。
  • 这本书是Teach yourself C# in 21 days,作者是 Bradley L. Jones。
  • @nenad:如果 Virtlink 是正确的并且就是那本书,那么您应该找到一本更新的书——至少涵盖 C# 3。(涵盖 C# 4 和 C# 5也不错,但是没有 LINQ 和 lambda 表达式的 C# 很恶心...)
  • 我同意,只是我在大学校园里几乎免费找到了这本二手书。我喜欢 Sams 系列书籍,因为我从其中一本书中学习了 Java。此外,本书的章节和我在大学学习的 JAVA 课程的章节几乎完全相同,也涵盖了非常相似的示例。我还买了更多最新的 C# 书籍,但我稍后会阅读。我还注意到你也出版了这本书——我可能会考虑购买它,一旦我完成了这些书。无论如何,谢谢你的建议。
【解决方案2】:

虽然middleNamestring,但middleName[0] 不是:它是middleName 的单个字符,它的初始字符。您不能将其与空字符串进行比较,但可以比较整个中间名,如下所示:

if (middleName != "")

查看字符串是否为空的更好方法是使用System.StringIsNullOrEmpty 方法:

if (!string.IsNullOrEmpty(middleName))

【讨论】:

  • 谢谢 - 我的最终解决方案是:if (middleName != "")
  • 其实这个 if (string.IsNullOrEmpty(middleName)) 应该是这样的: if (!string.IsNullOrEmpty(middleName))
【解决方案3】:

使用 middleName[0] 您将获得该字符串的第一个字符,因此是一个字符。

如果要比较字符串的第一个字符,请使用:

middleName[0] != ''

如果你想比较完整的字符串,那么:

middleName != ""

【讨论】:

  • '' 不是有效的字符文字。字符文字必须是单个字符
  • 您的建议指引我走向正确的方向。谢谢。但是这不起作用:middleName[0] != '' Error is "Empty character literal"
【解决方案4】:

代码应该是这样的:

if (middleName[0] != ' ')
{
    FullName.Append(middleName[0]);
    FullName.Append(". ");
}

甚至更好(假设这是代码的目的):

if (!String.IsNullOrWhiteSpace(middleName))
{
    FullName.Append(middleName[0]);
    FullName.Append(". ");
}

问题是代码试图将charstring 进行比较

middleName[0] 的类型为 char

"" 的类型为 string

【讨论】:

  • 你是对的,这有效: if (middleName[0] != ' ') 和其他解决方案也是如此。谢谢。
【解决方案5】:

middleName 被声明为字符串,这是真的。但是字符串由字符组成。您正在尝试访问字符串的第一个元素,即 char。 所以只需将其更改为

middleName != ""

middleName[0] != 'a'

如果你只想检查第一个字符

【讨论】:

    【解决方案6】:

    您正在尝试将一个字符(它总是一些东西,任何符号并且不能为空)与一个空字符串(不包含字符)进行比较。 请改用String.IsNullOrEmpty

    if(!String.IsNullOrEmpty(middleName[0]))
    

    如果你想检查你的 middleName 是否为空

    【讨论】:

      【解决方案7】:

      好像是书上的代码错误,

      不管怎样,当我把它改成:

      if( middleName != "" )
      

      代码完美运行。

      另外,为了额外检查 middleName 是否为 NULL(如果之前的程序逻辑跳过检查),解决方案可能是:

      if (!string.IsNullOrEmpty(middleName))
      

      【讨论】:

        猜你喜欢
        • 2013-10-12
        • 2016-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        相关资源
        最近更新 更多