Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota
Este artículo es una especificación de características. La especificación actúa como documento de diseño de la característica. Incluye cambios de especificación propuestos, junto con la información necesaria durante el diseño y el desarrollo de la característica. Estos artículos se publican hasta que se finalizan los cambios de especificación propuestos e se incorporan en la especificación ECMA actual.
Puede haber algunas discrepancias entre la especificación de características y la implementación completada. Esas diferencias se recogen en las notas de la reunión de diseño de lenguaje (LDM) correspondientes.
Puede obtener más información sobre el proceso de adopción de especificaciones de características en el estándar del lenguaje C# en el artículo sobre las especificaciones de .
Problema planteado por el experto: https://github.com/dotnet/csharplang/issues/7429
Resumen
Esta propuesta refina la determinación del tipo natural de un grupo de métodos de varias maneras:
- Considere los métodos candidatos ámbito por ámbito (comenzando con los métodos de instancia y luego cada ámbito subsiguiente de los métodos de extensión)
- Elimine a los candidatos que no tengan posibilidades de éxito, por lo que no interfieren con la determinación de una firma única:
- Eliminar métodos de instancia genéricos cuando no se proporciona ningún argumento de tipo (
var x = M;) - Eliminar métodos de extensión genéricos basados en poder reducir la extensión y en restricciones
- Eliminar métodos de instancia genéricos cuando no se proporciona ningún argumento de tipo (
Contexto sobre el tipo natural del grupo de métodos
En C# 10, los grupos de métodos obtuvieron un tipo natural débil.
Ese tipo es un "tipo débil" en el sentido en que solo entra en juego cuando el grupo de métodos no tiene el tipo de destino (es decir, no desempeña ningún rol en System.Action a = MethodGroup;).
Ese tipo natural débil permite escenarios como var x = MethodGroup;.
Como referencia: https://github.com/dotnet/csharplang/blob/main/proposals/csharp-10.0/lambda-improvements.md#natural-function-type
Un grupo de métodos tiene un tipo natural si todos los métodos candidatos del grupo de métodos tienen una firma común. (Si el grupo de métodos puede incluir métodos de extensión, los candidatos incluyen el tipo contenedor y todos los ámbitos del método de extensión).
En la práctica, esto significa que:
- Construya el conjunto de todos los métodos candidatos:
- los métodos del tipo pertinente están en el conjunto si son estáticos y el receptor es un tipo, o si no son estáticos y el receptor es un valor
- los métodos de extensión (en todos los ámbitos) que se pueden reducir se encuentran en el conjunto
- Si las firmas de todos los candidatos no coinciden, el grupo de métodos no tiene un tipo natural
- Si la aridad de la firma resultante no coincide con el número de argumentos de tipo proporcionados, el grupo de métodos no tiene un tipo natural.
- De lo contrario, la firma resultante se usa como tipo natural.
Propuesta
El principio es ir de ámbito en ámbito y descartar lo antes posible a los candidatos que sabemos que no pueden tener éxito (el mismo principio utilizado en la resolución de sobrecarga de funciones).
- Para cada ámbito, creamos el conjunto de todos los métodos candidatos:
- para el ámbito inicial, los métodos del tipo pertinente cuya aridad coincide con los argumentos de tipo proporcionados y que cumplen las restricciones impuestas por estos argumentos están en el conjunto si son estáticos y el receptor es un tipo, o si no son estáticos y el receptor es un valor.
- para ámbitos posteriores, los métodos de extensión de ese ámbito que se pueden sustituir con los argumentos de tipo proporcionados y reducidos usando el valor del receptor, mientras satisfacen las restricciones, están en el conjunto
- Si no tenemos candidatos en el ámbito especificado, continúe con el siguiente ámbito.
- Si las firmas de todos los candidatos no coinciden, el grupo de métodos no tiene un tipo natural
- De lo contrario, la firma generada se utiliza como el tipo natural.
- Si se agotan los ámbitos, el grupo de métodos no tiene un tipo natural.
Se relaciona con la propuesta de ámbito por ámbito: https://github.com/dotnet/csharplang/issues/7364 Se relaciona con la propuesta para controlar mejor los métodos de extensión genéricos: https://github.com/dotnet/roslyn/issues/69222
C# feature specifications