pregunta interesante.
En primer lugar, tenga en cuenta la diferencia entre los métodos anónimos y lambdas. Desde la perspectiva del escritor del compilador, la diferencia más importante es que lambdas puede requerir que el compilador infiera el tipo de parámetros del objetivo al que se le está asignando el lambda; Los métodos anónimos de C# 2 no tienen esta característica. Esta característica parece una pequeña diferencia, pero de hecho tiene importantes ramificaciones en la implementación del compilador. Ver mi serie del blog sobre este tema para algunos pensamientos acerca de por qué esto es:
http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx
Así que ahora vamos a llegar a su pregunta real: ¿por qué no podemos inferir outness/refness del tipo de destino en los parámetros de la lambda. Es decir, si tenemos delegate void D (out int x) entonces seguramente D d = x => {x = 10; } podría inferir que x es "out int".
No hay ninguna razón técnica que sepa por qué no pudimos hacer eso. Internamente en el compilador, los tipos de salida/ref se representan como tipos como cualquier otro.
Sin embargo, las funciones no se realizan solo porque se pueden hacer; terminan porque hay una razón de peso para hacerlo.Para lambdas, la razón de peso para hacer inferencia de tipo en primer lugar es LINQ; queremos poder hacer una transformación sintáctica simple en una comprensión de consulta en una llamada de método con lambdas, y dejar que el motor de inferencia de tipo de método resuelva los tipos de todos los parámetros lambda. Ninguno de los métodos LINQ generados tiene delegados con parámetros out o ref.
Por lo tanto, no tenemos un motivo convincente para realizar la función. Los delegados que tienen parámetros out/ref son relativamente raros. Y la asignación de lambdas a esos delegados es aún más rara. Entonces esta es una característica que no necesitamos y que beneficia a casi nadie.
C# 3 era el "polo largo" en el calendario de Visual Studio; tuvimos la mayor cantidad de días de trabajo programados para cualquier equipo que envíe un componente en VS. Eso significaba que todos los días nos salteamos el cronograma, se deslizó toda la división . Eso fue un poderoso desincentivo para pasar el tiempo en funciones innecesarias que no beneficiaban a nadie. Entonces el trabajo nunca fue hecho.
Estoy de acuerdo en que sería bueno ser más consecuente aquí, pero es poco probable que suceda. Tenemos muchas prioridades más altas.
Tengo curiosidad sobre esto yo mismo. Esperemos que Eric Lippert se dé cuenta de esta publicación ... es más probable que pueda dar una respuesta significativa a esto. – LBushkin
LBushkin, si quiere llamar mi atención sobre algo, siempre puede enviarlo a través del enlace de contacto en mi blog. –
Para los métodos anónimos con la palabra clave 'delegate', la regla es que o bien no especifica nada (omita incluso el paréntesis'() ') o especifica la firma completa incluyendo tipos de parámetros y modificadores como' ref'/'out'. Entonces 'ref' /' out' no es una excepción. Para lambdas, tu idea tiene sentido, pero no estoy seguro si creo que es buena. La sintaxis '(out t) => {...}' hace que parezca que "out" es el tipo del parámetro. Entonces 't => {...}' es mejor, pero podría ser "peligroso" si alguien olvida el significado de 'D' y edita el cuerpo' {...} 'de la lambda sin darse cuenta de' out' naturaleza de 't'. –