Información de tipo de referencia anulable no expuesta de FirstOrDefault


10

Quería probar el nuevo función de tipos de referencia anulables en C # 8.0.

Comencé un nuevo proyecto dirigido a .NET Core 3.0, habilité tipos de referencia anulables en el .csprojarchivo y comencé a codificar. Creé una lista simple que toma string[]ay devuelve el stringen esa matriz que es igual abc. Ahora, debido a que no estoy seguro de que abcrealmente exista en la matriz, uso FirstOrDefault(), que debería ser predeterminado nullsi no se encuentra una coincidencia.

using System;
using System.Linq;

public string FindArgument(string[] args)
{
    var arg = args.FirstOrDefault(x => x == "abc");
    return arg;
}

Mi método regresa string, que ahora debería ser del tipo no anulable . Dado que FirstOrDefault()puede regresar null, esperaría que el método anterior arroje una advertencia al devolver la variable quizás nula arg . No es asi.

Mirando la firma FirstOrDefault()en Visual Studio, queda claro por qué : el método devuelve un string, no el equivalente anulable string?que esperaría.

El uso del siguiente método del método produce la advertencia que esperaba:

var arg = args.Contains("abc") ? "abc" : null;
return arg;

¿Las bibliotecas del sistema (en este ejemplo System.Linq) realmente no exponen información de nulabilidad cuando se dirigen a .NET Core 3.0?

Respuestas:


9

Parece que System.Linqno está anulado anulable en la versión 3.0. Por lo tanto, los tipos de referencia anulables no emiten la advertencia correcta.

Puede verificar problemas similares en el repositorio de roslyn . Este problema abierto en Github es muy similar a tu problema. En ese número, un colaborador explica el problema actual:

System.Linqes anulable anotado en la rama maestra de corefx, pero no en la versión / 3.0 . Entonces no hay nada inesperado en el compilador. El compilador debe proporcionar algunos diagnósticos que demuestren que está utilizando material que no admite nulos.


Para agregar a esto, puede usar este paquete para obtener las anotaciones correctas hoy.
canton7

1
Este sigue siendo el caso en .NET Core 3.1. Hace que trabajar con tipos de referencia anulables sea menos agradable. Creo que la solicitud de extracción corefx / pull / 40651 soluciona esto, pero aparentemente tendremos que esperar hasta .NET 5 para obtener eso :-(
Jeppe Stig Nielsen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.