我有以下
IPublishedContentProperty propTitle; // the type is not nullable
// Compiles, 2 GetProperty calls
var title = x.GetProperty("title").HasValue ? x.GetProperty("title").Value : null;
// Does not compile, 1 GetProperty call
title = (propTitle=x.GetProperty("title") && propTitle.HasValue) ?propTitle.Value:null;
假设GetProperty
是一项耗时的操作,而我只想调用一次此方法。
因此,第一行是编译时。第二个没有,但是我想实现。
约束:
if
块。 PS。 .HasValue
并不意味着该类型可以为空,而只是具有这种bool属性的类型。
答案 0 :(得分:3)
未编译的原因:&&
在=
之前进行评估。并且&&
显然不是对这些类型的有效操作。
这可以用大括号固定。然后可以将.HasValue
应用于赋值的结果(这是已赋值的对象或值)。
title = (propTitle = x.GetProperty("title")).HasValue ? propTitle.Value : null;
编辑:您可以通过定义扩展方法使该表达式更短,更易读。如果您在多个地方使用该构造,那么它还将减少冗余和混乱。
示例:
namespace Your.Project.Helpers
{
public static class PropertyHelper
{
// use actual type (or interface)
public static string GetValueOrDefault(this Property p)
{
return p.HasValue ? p.Value : null;
}
}
}
用法:
using Your.Project.Helpers;
...
var title = x.GetProperty("title").GetValueOrDefault();