Soy un gran admirador de las referencias anulables de C# y las habilitamos en todos nuestros nuevos proyectos. Recientemente, estaba revisando un PR de un compañero de trabajo y descubrí que el atributo [Opcional] se usaba junto al parámetro de referencia sin especificar un valor predeterminado. Esto significaría que estamos rompiendo la "restricción de referencia anulable" ya que el valor predeterminado para el argumento de la función sería nulo, aunque el argumento no esté marcado como anulable. Por favor, vea el código de ejemplo a continuación:
class Program { internal class Data { internal int Count { get; set; } = 3; } static void Main(string[] args) { BadUse(); GoodUse(); } static void BadUse([Optional] Data data) => Console.WriteLine($"Data: ${data.Count}"); static void BadUse2([Optional, DefaultParameterValue(null)] Data data) => Console.WriteLine($"Data: ${data.Count}"); static void GoodUse(Data? data = null) => Console.WriteLine($"Data: ${data?.Count}"); } Como puede ver, el método BadUse anterior es incorrecto y provocará una excepción de referencia nula sin ninguna advertencia ni error de compilación. Naturalmente, usamos el patrón de argumento opcional más legible como en GoodUse . Me pregunto si esto es un error en el compilador de C# o me falta algo aquí. Esperaría ver un error de compilación o al menos alguna advertencia. Tenga en cuenta que cuando se usa el atributo DefaultParameterValue en BadUse2 , obtenemos la esperada "Desreferencia CS8602 de una referencia posiblemente nula".