3

是否可以一起用任何方式操作??,并在接下来的情况下,运营商&&空 - 结合运营商和运营商&&

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

这意味着下一个:

  • 如果any为null那么this.Any.HasValue返回false
  • 如果any有值,那么它返回值考虑另一个布尔属性,即Any && SomeBool
+0

你为什么会想用这个?运营商?为了缩短它? – 2010-04-27 22:31:27

+0

@亨克霍尔特曼:是的。并为操作员使用练习。 – abatishchev 2010-04-27 22:33:24

回答

4

我不知道为什么没有人说得清这至今:

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

这将返回

  • null如果any为空,不管是什么的this.SomeBool值;
  • true如果anythis.SomeBool都为真;和
  • false如果any不为空,并且this.SomeBool为假。
+0

代码看起来不错,尽管描述是错误的(你怎么能同时返回'null'和'false',然而这就是你的规则会发生的'any = = null'和'this.SomeBool == false'。 – 2010-04-28 00:32:14

+0

@Henk Holterman:为什么操作数是''bool'和'bool?''而不是''bool?'和'bool'!?左边的操作数是显然是'bool?'类型,因为我声明了这样的结果。 – dtb 2010-04-28 10:16:36

+1

@亨克Holterman:是的,但是我在将它复制到我的答案时犯了一个错字:-(现在修正了。 bool y = true; bool?z = x & y;' – dtb 2010-04-28 11:18:24

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是相同。但也许这种行为不是必需的?

+0

不幸的是,没有。 '结果为bool?'总是'HasValue = true'。不是吗? – abatishchev 2010-04-27 22:25:02

+0

你是对的Henk,行为是不同的 – 2010-04-27 22:31:44

+1

他希望返回null,如果任何为null并且其他两个条件为false。所以,他希望得到TRUE,FALSE和NULL – Armstrongest 2010-04-27 22:34:10

-1

这样做的行为你描述:

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

+0

作为丹尼尔伦肖的回答,你的人也总是有价值 - '真'或'假',从不'空' – abatishchev 2010-04-27 22:27:58

4

既然你想万一返回null源是null,我不认为??是要帮你写这个的任何短或更清晰。

+0

看来你是对的。运算符'??'用于在任何情况下返回一个值。这正是我所不需要的。 – abatishchev 2010-04-27 22:35:39

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,对吧?

1

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

3

Null合并操作符不会为您如何为您的方法构建逻辑而工作。当然你可以强迫它在那里,但它会看起来很丑,只是混淆了谁读它。

我发现原始代码很难阅读和理解,所以重构和删除三元操作符来揭示意图。

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;