空融合运算符和运算符&&在C#中

时间:2010-04-27 22:20:03

标签: c# boolean-logic logical-operators null-coalescing-operator

在下一种情况下,是否可以同时使用运算符??和运算符&&

bool? Any
{
   get
   {
      var any = this.ViewState["any"] as bool?;
      return any.HasValue ? any.Value && this.SomeBool : any;
   }
}

这意味着下一步:

  • 如果any为空,则this.Any.HasValue返回false
  • 如果any有值,则返回值,考虑另一个布尔属性,即Any && SomeBool

7 个答案:

答案 0 :(得分:4)

由于您希望在来源为null的情况下返回null,我认为??不会帮助您更短或更清楚地写出来。

答案 1 :(得分:4)

我想知道为什么到目前为止没人提出这个建议:

bool? any = this.ViewState["any"] as bool?;
return any & this.SomeBool;

返回

  • null如果any为空,无论this.SomeBool的价值是多少;
  • 如果trueany都为真,则
  • this.SomeBool;和
  • 如果false不为空,则{li> anythis.SomeBool为false。

答案 2 :(得分:3)

这是你的意思吗?

bool? Any 
{ 
   get 
   { 
      return ((this.ViewState["any"] as bool?) ?? false) && this.SomeBool;
   } 
} 

我将返回值保留为bool?但看起来它可以改为只是布尔。

这是经过这样的测试:

class Program
{
    private static readonly Dictionary<string, object> ViewState = new Dictionary<string, object>();
    private static bool SomeBool;

    static void Main(string[] args)
    {
        ViewState["any"] = (bool?)null; SomeBool = true; Console.WriteLine(Any);
        ViewState["any"] = (bool?)false; SomeBool = true; Console.WriteLine(Any);
        ViewState["any"] = (bool?)true; SomeBool = true; Console.WriteLine(Any);
        ViewState["any"] = (bool?)null; SomeBool = false; Console.WriteLine(Any);
        ViewState["any"] = (bool?)false; SomeBool = false; Console.WriteLine(Any);
        ViewState["any"] = (bool?)true; SomeBool = false; Console.WriteLine(Any);
        Console.ReadLine();
    }

    static bool? Any
    {
        get
        {
            return ((ViewState["any"] as bool?) ?? false) && SomeBool;
        }
    }
}

返回

False
False
True
False
False
False

此处的行为与原始行为不完全相同,因为测试用例1和4应返回相同的null。但也许这种行为不是必需的?

答案 3 :(得分:3)

我认为你要做的是:

return any ?? (any.Value && this.SomeBool) ? true : new Nullable<bool>();

但是,我认为在这种情况下,使用if块可能更清楚:

if ( !any.HasValue )
  return (any.Value && this.SomeBool) ? true : any;
else 
  return any;

如果有null,那么您想要返回truenull,对吧?

答案 4 :(得分:3)

Null Coalescing运算符不适用于您为方法构建逻辑的方式。当然你可以把它强行放在那里,但它会看起来很难看,只会让读者误解。

我发现原始代码难以阅读和理解,因此重构并删除了三元运算符以显示意图。

bool? any = this.ViewState["any"] as bool?;

if (any == null)
    return null;

return any.Value && this.SomeBool;

Null coalescing只是一个很好的速记,应该明智地使用

Person contact = Mother ?? Father ?? FirstSibling;

更多的意图揭示,更容易阅读+维护:

Person contact = Mother;
if (contact == null)
    contact = Father;
if (contact == null)
    contact = FirstSibling;

答案 5 :(得分:1)

事情是,你真的不想用??运营商。它的目的是让你很容易避免空值,你实际上想要保留空值。

答案 6 :(得分:-1)

这有您描述的行为:

return (any ?? false) && this.SomeBool