C# 简单字符串比较因性别检查而失败

C# 简单字符串比较因性别检查而失败,c#,C#,我要求输入用户性别和有效值 男性 女性 代码: string gender = Console.ReadLine(); if(gender!="Male" || gender !="Female") { Console.WriteLine("Invalid gender"); } 这里的问题是,即使我输入男性或女性,它也会进入逻辑并显示“无效性别”。我只是不明白为什么在这个简单的字符串比较中会出现这种情

我要求输入用户性别和有效值

  • 男性
  • 女性
代码:

        string gender = Console.ReadLine();
        if(gender!="Male" || gender !="Female")
        {
            Console.WriteLine("Invalid gender");
        }

这里的问题是,即使我输入男性或女性,它也会进入逻辑并显示“无效性别”。我只是不明白为什么在这个简单的字符串比较中会出现这种情况

你需要确保性别不是男性也不是女性

string gender = Console.ReadLine();
if (gender != "Male" && gender != "Female")
{
    Console.WriteLine("Invalid gender");
}

我认为这是语言逻辑到c#逻辑的简单误译。如果你对另一个人说“如果性别不等于男性或女性,那就显示错误”,他们就会知道你想要什么,这是一种非常自然的说法

人类可能会将此视为一个有效选项列表,在心理上接受输入并搜索列表,如果没有找到,他们会说这是一个错误。这不能像口头上那样直接用c表示,只使用简单的比较运算符

也就是说,你不能说:

if(gender != "Male" || "Female")
因为你必须对两者进行性别测试。我认为您随后扩展了上面不正确的c#,因此它在语法上是有效的:

if(gender != "Male" || gender != "Female")
if( !(gender == "Male" || gender == "Female") )
这在语法上有效,但在逻辑上无效;现在,无论您键入什么,OR的一侧总是正确的


所以我的断言是事情很早就出了问题。回想一下动词是如何变成c的#

如果我们从左到右阅读英语推理,我们可能会错误地抓住第一个短语,并将其作为一个条件——“如果性别不等于男性”。事实上,要想成功地翻译,这需要向后阅读,以便我们首先抓住“男性或女性”部分。此表达式在逻辑上是正确的:

//"if gender is not equal to (male or female) show an error"
if( !(gender == "Male" || "Female") )
然后我们可以将其展开,使其在语法上有效:

if(gender != "Male" || gender != "Female")
if( !(gender == "Male" || gender == "Female") )
最后一种形式更接近于我们谈论逻辑事物的方式。此表格在以下情况下同样有效:

if( (gender != "Male" && gender == "Female") )
您可以将此作为一条规则来记忆-要重写
NOT(x等于y或x等于z)
的逻辑,您可以删除NOT并反转等于,还可以交换或换和,反之亦然,因此
(x NOTEQUALS y和x NOTEQUALS z)

这种信件形式也是有效的,但你不大可能对另一个人说“如果性别不等于男性也不等于女性”


ps:如果有两个或三个以上的项目,可以更清楚地列出有效选项,并说:

if(!validOptions.Contains(gender))

这也表达了人类在心理上如何处理较长列表的任务

| | |(或)意味着其中一个条件应该是正确的。如果你的性别=男性,那么性别!=女性和女性。您需要&(和)检查它是否不等于一个或不等于另一个。它总是不等于其中的一个,所以它总是
真的
如果(性别!=“男性”&&gender!=“女性”)@Steve Omg我有时太笨了。是的,你说得对。非常感谢你。感激:)@Knoop天哪,我有时候真是太蠢了。是的,你说得对。非常感谢你。感谢:)事实上,如果你不想让用户生气,我怀疑这对大多数系统来说都是个坏主意。。。而且在大多数情况下,性别是不相关的,所以为什么还要问“如果”作为输入呢?对于你为一个很好的解释和回答所做的努力,我投了赞成票。非常感谢,是的,你是对的:)