¿Agregar int e int? en Kotlin

Me encontré con un problema, que parece tan simple que cualquiera debería haberse topado con él en algún momento u otro, pero no pudo encontrar una solución en ninguna parte.

Copiado de REPL:

var a : Int = 1 var c : Int? = 3 a + if (c != null) {c} else {0} ERROR: None of the following functions can be called with supplied argument (followed by the various implementations of kotlin.int.plus()) 

Entonces, ¿qué estoy tratando de hacer es agregar un Int y un Int? y me gustaría que el resultado sea un Int. Muy simple. ¡Soy consciente de eso !! operador, sin embargo, quiero evitar usar esto siempre que sea posible, ya que no es seguro para cambios †.

 a + if (c != null) {c!!} else {0} 4 

Soy consciente de la siguiente solución, que maneja la security nula y evita el uso de la !! operador.

 a + (c ?: 0) 4 

Mi pregunta es la siguiente: ¿Hay alguna manera de hacer una adición con el uso de un bloque if-else y / o un bloque when, que no requiere el uso del bloque !! operador. Mi razón para preferir el uso de if-else y no del operador de Elvis es la inteligibilidad para personas de idiomas sin un operador de Elvis. Así que me gustaría estar lo más cerca posible de a a + if (c != null) {c} else {0} .

Gracias, si mi problema o motivación no está claro o es contrario al layout o intención de Kotlin, háganmelo saber.

† Claro, puedo afirmar que alguna variable es segura en el momento en que se agrega, pero esta afirmación permanecerá allí incluso cuando cambie el código a su alnetworkingedor, posiblemente invalidando la aserción, anulando uno de los puntos de Kotlin: security nula.

El problema es que kotlin solo puede suponer que una variable nunca es nula después de una comprobación nula si no hay forma de que esa variable pueda cambiar el valor entre las operaciones.

No sé exactamente cómo se implementa el REPL, pero creo que las variables se insertan como miembros en una class de context. Esto significa que el comstackdor no puede asumir que no pueden ocurrir cambios, ya que otro hilo puede cambiar el valor entre las operaciones.

Entonces parece que esta característica no funciona en REPL, pero el operador elvis es una alternativa bastante limpia.

  • Modelo lleno con respuesta extra usando Rx
  • Hubo un error al procesar los informes de cobertura en codecov
  • kotlin cómo referir el scope externo esto en funciones de aplicación multicapa
  • Dokka: omita la generación de javadoc para los packages pnetworkingeterminados de Android
  • ffmpeg errores de desencoding legítimos
  • No se puede crear una instancia de actividad | Causado por: kotlin.KotlinNullPointerException
  • instancia :: class.java vs. instance.javaClass
  • Tipo de Kotlin no coincide al pasar el parámetro
  • "+" En Kotlin Coroutines?
  • java.lang.AbstractMethodError: método abstracto al ejecutar espresso en Kotlin con Mockito
  • Si isConnected devuelve verdadero, ¿por qué Exeption dice que no está conectado?