3

在下一种情况下,是否可以以任何方式一起使用运算符??和运算符:&&

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
4

7 回答 7

4

由于您想null在源为 的情况下返回null,因此我认为不会??帮助您将其写得更短或更清晰。

于 2010-04-27T22:26:44.150 回答
4

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

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

这返回

  • nullifany为 null,不管它的值this.SomeBool是什么;
  • true如果两者anythis.SomeBool为真;和
  • falseifany不为空,并且this.SomeBool为假。
于 2010-04-28T00:03:01.687 回答
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 以使其相同。但也许这种行为不是必需的?

于 2010-04-27T22:22:58.830 回答
3

Null Coalescing 运算符不适用于您为方法构建逻辑的方式。当然你可以把它强行放进去,但它会看起来很丑,而且会让任何阅读它的人感到困惑。

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

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

if (any == null)
    return null;

return any.Value && this.SomeBool;

空值合并只是很好的简写,应该明智地使用

Person contact = Mother ?? Father ?? FirstSibling;

比以下更能表达意图,更容易阅读和维护:

Person contact = Mother;
if (contact == null)
    contact = Father;
if (contact == null)
    contact = FirstSibling;
于 2010-04-28T00:26:18.977 回答
2

我认为你想要做的是:

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

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

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

如果有 is null,那么您想返回trueor null,对吗?

于 2010-04-27T22:30:56.827 回答
1

问题是,你真的不想使用 ?? 操作员。它的目的是让避免空值变得容易,你实际上想要保留空值。

于 2010-04-27T22:42:05.373 回答
-1

这具有您描述的行为:

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

于 2010-04-27T22:25:34.793 回答