Anulabilidad de variable en C# 8
Como parte de nuestro curso de C# te explicamos este tema. La nulabilidad de una variable está determinada por otra variable. En este siguiente ejemplo de código, la clase está diseñada de tal manera que m_ListeningToItemEvents será verdadero si y solo si m_ItemPropertyChanged no es nulo. No hay forma de que el compilador conozca esta regla. Cuando eso ocurra, puedes agregar el operador de nulidad (!) a la variable (m_ItemPropertyChanged en este caso) para indicar que no será nulo en ese momento.
if (m_ListeningToItemEvents) { if (item is INotifyPropertyChangedWeak) ((INotifyPropertyChangedWeak)item).AddHandler(m_ItemPropertyChanged!); else if (item is INotifyPropertyChanged) ((INotifyPropertyChanged)item).PropertyChanged += OnItemPropertyChanged; }
Corrección de falsos positivos con casting explícito.
En este siguiente ejemplo, el compilador informa falsamente que la nulabilidad de m_Base.Values ??no es compatible con IEnumerable <TValue>. Para eliminar la advertencia, puedes agregar el reparto explícito que se ve a continuación:
readonly Dictionary<ValueTuple<TKey1, TKey2>, TValue> m_Base; IEnumerable<TValue> IReadOnlyDictionary<ValueTuple<TKey1, TKey2>, TValue>.Values { get { return (IEnumerable<TValue>)m_Base.Values; } }
Ten en cuenta que el compilador marca esa línea como una conversión redundante. Normalmente, este es un mensaje del compilador, en lugar de una advertencia, pero es de esperar que se corrija a tiempo para el momento del lanzamiento.
Corrección de falsos positivos con variables temporales o conversiones condicionales.
En el siguiente ejemplo, el compilador indica que hay un error en la línea CancelEdit. Aunque la instrucción if anterior prueba que item.Value no es nulo, el compilador no confía en que la próxima vez que lea el item.Value todavía no sea nulo.
foreach (var item in m_CheckpointValues) { if (item.Value is IEditableObject) ((IEditableObject)item.Value).CancelEdit(); }
Una forma de satisfacer al compilador es almacenar item.Value en una variable temporal.
foreach (var item in m_CheckpointValues) { object? value = item.Value; if (value is IEditableObject) ((IEditableObject)value).CancelEdit(); }
Pero en este caso, podemos simplificarlo aún más utilizando una conversión condicional, como operador, seguida de una invocación de método condicional.
foreach (var item in m_CheckpointValues) { (item.Value as IEditableObject)?.CancelEdit(); }
En una nota siguiente hablaremos más de este tema. Para poder entender mejor los lenguajes de programación, puedes tomar un curso de Visual Basic, para complementar tu uso de .NET. Además te ayudará tomar un curso de MySQL.