在下一种情况下,是否可以同时使用运算符??
和运算符&&
:
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
答案 0 :(得分:4)
由于您希望在来源为null
的情况下返回null
,我认为??
不会帮助您更短或更清楚地写出来。
答案 1 :(得分:4)
我想知道为什么到目前为止没人提出这个建议:
bool? any = this.ViewState["any"] as bool?;
return any & this.SomeBool;
返回
null
如果any
为空,无论this.SomeBool
的价值是多少; true
和any
都为真,则this.SomeBool
;和false
不为空,则{li> any
,this.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
,那么您想要返回true
或null
,对吧?
答案 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