una sola sharp que programacion pasada lenguaje historia descargar compilador caracteristicas c# csc

sola - lenguaje de programacion c# caracteristicas



¿Por qué falla el compilador de C#en este código? (2)

Bueno, la respuesta a su pregunta sobre POR QUÉ bloquea el compilador, es porque ha encontrado un error que ... bloquea el compilador.

El compilador VS2013 dice "Error interno del compilador (0xc0000005 en la dirección 012DC5B5): el culpable probable es ''TRANSFORMAR''", así que claramente es un error.

C0000005 suele ser un puntero nulo, o hacer referencia a memoria no asignada o eliminada. Es una falla de protección general.

EDITAR:

El problema también está presente en casi cualquier tipo de tipo genérico de parámetros múltiples donde cualquier parámetro es dinámico. Por ejemplo, se bloquea en:

List<Tuple<string, dynamic>>{}

También se estrella en

List<KeyValuePair<dynamic, string>>{}

Pero no se estrella en

List<dynamic>{}

pero se estrella en

List<List<dynamic>>{}

¿Por qué el siguiente código bloquea el compilador .NET? Fue probado en csc.exe versión 4.0.

Consulte, por ejemplo, aquí para ver una demostración en línea de una versión diferente: se bloquea de la misma manera y dice que no se admite la dinámica https://dotnetfiddle.net/FMn59S :

Error de compilación (línea 0, columna 0): Error interno del compilador (0xc0000005 en la dirección xy): el culpable probable es ''TRANSFORMAR''.

El método de extensión funciona bien en la List<dynamic> sin embargo.

using System; using System.Collections.Generic; static class F { public static void M<T>(this IEnumerable<T> enumeration, Action<T> action){} static void U(C.K d) { d.M(kvp => Console.WriteLine(kvp)); } } class C { public class K : Dictionary<string, dynamic>{} }

Actualización: esto no bloquea el compilador

static void U(Dictionary<string, dynamic> d) { d.M(kvp => Console.WriteLine(kvp)); }

Actualización 2: el mismo error se informó en http://connect.microsoft.com/VisualStudio/feedback/details/892372/compiler-error-with-dynamic-dictinoaries . El error se informó para FirstOrDefault, pero parece que el compilador se bloquea en cualquier método de extensión aplicado a la clase derivada del Diccionario <T1, T2>, donde al menos uno de los tipos de parámetros es dynamic . Vea una descripción aún más general del problema a continuación por Erik Funkenbusch.

Actualización 3: otro comportamiento no estándar. Cuando intento llamar al método de extensión como un método estático, es decir, FM(d, kvp => Console.WriteLine(kvp)); , el compilador no falla, pero no encuentra la sobrecarga: Argument 1: cannot convert from ''CK'' to ''System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,dynamic>>''

Actualización 4 - SOLUCIÓN (tipo de): Hans dibujó la segunda solución, que es semánticamente equivalente al código original, pero funciona solo para la llamada al método de extensión y no para la llamada estándar. Dado que el error es probablemente causado por el hecho de que el compilador no puede convertir la clase derivada de la clase genérica con múltiples parámetros (uno de ellos dinámico) a su supertipo, la solución es proporcionar una conversión explícita. Ver https://dotnetfiddle.net/oNvlcL :

((Dictionary<string, dynamic>)d).M(kvp => Console.WriteLine(kvp)); M((Dictionary<string, dynamic>)d, kvp => Console.WriteLine(kvp));