我想否定以下表达式:
return SpUtils.loadEMail()?.isEmpty() ?: false
如果我添加一个!在表达之前,比如
return !SpUtils.loadEMail()?.isEmpty() ?: false
IDE(Android Studio)告诉我
在类型为kotlin.Boolean的可空接收器上只允许安全(?。)或非空断言(!!。)调用?
我如何否定这种表达方式?
答案 0 :(得分:7)
您可以使用可以为空的引用。
SpUtils.loadEMail()?.isEmpty()
此代码生成类型布尔值的值,其平均表达式可以返回布尔或 null 的实例。
我建议使用以下代码来解决您的问题:
return !(SpUtils().loadEMail()?.isEmpty() ?: false);
您尝试否定布尔值而不是布尔,elvis运算符返回!
答案 1 :(得分:2)
在这种情况下,它会返回:
loadEmail()
调用的结果不是 null
null
否则 !
是一个built-in布尔运算,它调用名为package.Boolean
的{{1}}运算符,该运算符仅适用于非可空引用。 not()
的结果为?.
,因此您会收到错误消息。
如果你想否定整个表达,你可以坚持iRus的答案:
Boolean?
如果您想取消只是 !(SpUtils().loadEMail()?.isEmpty() ?: false)
部分,那么正确的变体将是:
SpUtils().loadEMail()?.isEmpty()
如果!(SpUtils().loadEMail()?.isEmpty() ?: true)
的结果为空(没有邮件),那么elvis运营商将返回?.
(没有电子邮件),你将否定它。
答案 2 :(得分:0)
private static List<T> RunQuery<T>(string query, object parameters = null)
{
return WithCache(query, parameters, () => RunNoCacheQuery<T>(query, parameters));
}
private static List<T> RunNoCacheQuery<T>(string query, object parameters = null)
{
using (var conn = ConnectionFactory.GetConnection())
{
conn.Open();
var data = conn.Query<T>(query, parameters).ToList();
conn.Close();
return data;
}
}
可行,但实际上很难看到!(SpUtils().loadEMail()?.isEmpty() ?: false)
。
当true
的结果为空或不为空时,它返回true
。有了这些知识,我们就可以轻松地做出可读的东西:
SpUtils().loadEMail()
您可以扩展它以获得更好的可读性:
return SpUtils().loadEMail()?.isNotEmpty() ?: true