C# 带有多个条件而不是使用AND的if语句

C# 带有多个条件而不是使用AND的if语句,c#,C#,我一直在搜索关于带有多个条件的if语句的一些信息,但没有找到与我的问题对应的信息 我想知道你是否可以写: int n = 3 if (3 < n < 20) { //do something.. } int n=3 如果(3

我一直在搜索关于带有多个条件的if语句的一些信息,但没有找到与我的问题对应的信息

我想知道你是否可以写:

int n = 3
if (3 < n < 20)
{
   //do something..
}
int n=3
如果(3
而不是做:

if (n > 3 && n < 20)
{
   //do something..
}
if(n>3&&n<20)
{
//做点什么。。
}
第一句话对我不起作用,我认为它应该起作用,因为它很简单


也许有人可以给我正确的语法,或者根本不可能,我只需要使用and。

来解释它无效的原因:

if (3 < n < 20)
if(3
可以改写为:

if ((3 < n) < 20)
if((3
现在
3
的结果将是一场灾难

所以基本上你会得到:

if (true/false < 20)
if(真/假<20)

这在C#中无效。

通常不可能实现您想要做的事情

但在逻辑中,如果要执行单线性逻辑,可以使用三元运算符

例如,您需要将n的值分配给variblae
result
,否则默认值应为0

int result = n > 3 ? (n < 20 ? n : 0) : 0
int结果=n>3?(n<20?n:0):0
相当于

int result = 0;
if (n > 3 && n < 20)
{
   result = n;
}
int结果=0;
如果(n>3&&n<20)
{
结果=n;
}

斯特凡的回答解释了为什么这是不可能的。
但这里有一个解决方法,如果您不想每次都编写讨厌的
&&
显式条件,您可以创建一个扩展方法:

public static class IComparableExtensions
{
    public static bool Between<T>(this T self, T low, T high) where T : IComparable
    {
        return self.CompareTo(low) > 0 && self.CompareTo(high) < 0;
    }
}
但是,请注意,这可能会令人困惑,因为
Between
没有指定比较是包含的、独占的还是仅在一个方向上包含的,所以如果比较,比如说,
20。Between(10,20)
,它应该返回true还是false

更好的方法需要向方法中添加另一个变量,以表明:

[Flags]
public enum CompareMode
{
    Exclusive = 0,
    IncludeLow = 1,
    IncludeHigh = 2,
    Inclusive = IncludeLow | IncludeHigh
}

public static class IComparableExtensions
{
    public static bool Between<T>(this T self, T low, T high, CompareMode mode) where T : IComparable
    {
        var compareLow = (mode & CompareMode.IncludeLow) == CompareMode.IncludeLow ? 0 : 1;
        var compareHigh = (mode & CompareMode.IncludeHigh) == CompareMode.IncludeHigh ? 0 : -1;
        return self.CompareTo(low) >= compareLow && self.CompareTo(high) <= compareHigh;
    }
}


这样,阅读此代码的另一个人(甚至是您,6个月后)将立即知道,如果Between是包含的、独占的或其他的,则无需查看
Between
扩展方法内部。

否,您需要使用第二种语法,第一个版本不起作用。当你尝试它时会发生什么?@Malling为了得到这种确认,你的编译器甚至比这还要快!;)@阿德里亚诺雷佩蒂公平地说,它不起作用的原因稍微有点模糊。@Malling如果你在寻找一个“为什么”,那么我一定要推翻我的否决票。这本身不是一个坏问题。顺便说一句,其他一些(非数学)语言允许您以这种方式编写(例如Python),但每种语言的工作原因可能非常不同。哦,是的,这解释了错误,我说它无法从bool转换为int。感谢您的解释!我把它标记为解决方案,因为它解释了为什么我不能这么做!它是无效的,因为语言设计者不允许问题中的语法。如果他们愿意的话,他们本可以允许的。嗨@LasseVågsætherKarlsen:这就是我的意思,我明确地说这是一个C的东西:“这在C中是无效的”。我同意我的答案是一个很好的辩论主题,但我在这里的主要目的是让OP看到“为什么”(现在),它是无效的,解释错误,主要是为了他/她能够在未来发现类似的事件。尽管如此,你是对的,这是设计者的选择,许多其他语言都会接受这种语法。你不是在调用一个方法来做OP一开始不想做的事情吗?@Amit是的,但是扩展方法的目的是消除每次编写显式条件的需要。这只是一条捷径…@Amit为了更好地解释这一点,我编辑了我的答案。谢谢你的评论,我的答案现在更好了,谢谢!
[Flags]
public enum CompareMode
{
    Exclusive = 0,
    IncludeLow = 1,
    IncludeHigh = 2,
    Inclusive = IncludeLow | IncludeHigh
}

public static class IComparableExtensions
{
    public static bool Between<T>(this T self, T low, T high, CompareMode mode) where T : IComparable
    {
        var compareLow = (mode & CompareMode.IncludeLow) == CompareMode.IncludeLow ? 0 : 1;
        var compareHigh = (mode & CompareMode.IncludeHigh) == CompareMode.IncludeHigh ? 0 : -1;
        return self.CompareTo(low) >= compareLow && self.CompareTo(high) <= compareHigh;
    }
}
if(n.Between(3, 20, CompareMode.Exclusive))
{
    // do your stuff here
}