c# - studio - ¿Cómo sabe ReSharper que este tipo de retorno nunca es nulo?
resharper visual studio 2019 (2)
Estoy usando ReSharper 5.0 y me pregunto cómo su función de análisis de código sabe resaltar los siguientes assemblies == null
con el comentario "La expresión siempre es falsa".
var directory = new DirectoryInfo("somedir");
FileInfo[] assemblies = directory.GetFiles("*.dll");
if (assemblies == null <<--- this is highlighted with "Expression is always false"
|| assemblies.Length == 0)
{
_log.Warn("No assemblies found");
}
Entendería si el tipo de retorno era un tipo de valor, y no lo es. También entendería si hubo algún tipo de contrato de código o metadatos que indiquen que .GetFiles()
nunca devolverá el valor nulo. Pero no creo que haya.
Entonces, ¿cómo sabe esto? ¿Me estoy perdiendo algo obvio, o ReSharper tiene algún conocimiento privilegiado, como una lista interna de metadatos sobre métodos de marco? ¿O es realmente " introspectivo " el código interno y lo resuelve?
Como señala Tim, anotamos el .NET Framework. Es similar a lo que se obtiene con los Contratos de Código, pero se hace un poco diferente. Si busca debajo de la carpeta bin en la instalación de ReSharper, puede ver todas las anotaciones.
Los desarrolladores de ReSharper ejecutaron el análisis de flujo en los binarios de .NET framework y determinaron qué métodos pueden o no devolver el null
. Al parecer DirectoryInfo.GetFiles
nunca devuelve null
.
Puede anotar su propio código para indicar el mismo conjunto de reglas, con un conjunto de JetBrains.
atributos Eche un vistazo al sitio ReSharper: http://www.jetbrains.com/resharper/features/code_analysis.html#Annotated_Framework
Edición: para responder a su pregunta específicamente, "¿ReSharper tiene algún conocimiento privilegiado, como una lista interna de metadatos sobre los métodos de marco"? Sí, vino de "inspeccionar el código interno y resolverlo"