Есть причина для такого поведения.По сути, это потому, что компилятор не может гарантировать, что значение user
не станет нулевым после проверки if
.
Это поведение применимо только для var user
, но не для val user
.Так, например,
val user: User? = null;
if (user != null) {
// user not null
val name = user.name // won't show any errors
}
var user: User? = null;
if (user != null) {
// user might be null
// Since the value can be changed at any point inside the if block (or from another thread).
val name = user.name // will show an error
}
let
позволяет обеспечить неизменность даже для var
переменных.let
создает новое конечное значение отдельно от исходной переменной.
var user: User? = null
user?.let {
//it == final non null user
//If you try to access 'user' directly here, it will show error message,
//since only 'it' is assured to be non null, 'user' is still volatile.
val name = it.name // won't show any errors
val surname = user.surname // will show an error
}