visual una studio método metodos metodo llamar instanciar genérica funciones extensión estática definirse declara debe como clases clase biblioteca c# visual-studio-2015 extension-methods method-group

una - metodos y funciones en c#



Llamada al método de extensión Visual Studio 2015 como grupo de métodos (3)

No veo cómo funcionó en VS2013. RemoveDetail es un método de TMethod no su Action MyClass .

Debería ser algo así como

z.ForEach(x => master.RemoveDetail(x);

Tengo un método de extensión como

public static void RemoveDetail<TMaster, TChild>(this TMaster master, TChild child) where TMaster : class, IMaster<TChild> where TChild : class, IDetail<TMaster>;

Y tengo dos clases

public class Principal : IMaster<Permission> { public virtual IEnumerable<Permission> Permissions { get; } }

y

public class Permission : IDetail<Principal>

Llamo a RemoveDetail de una Acción aceptada por el método public static void Foreach<T>(this IEnumerable<T> source, Action<T> action); :

aPrincipal.Permissions.Foreach(x => aPrincipal.RemoveDetail(x));

ReSharper me sugiere reemplazar esta llamada por un grupo de métodos como

aPrincipal.Permissions.Foreach(aPrincipal.RemoveDetail);

Esto funcionó bien en VS2013 y anteriores pero falla en la compilación en VS2015 con

''Principal'' no contiene una definición para ''RemoveDetail'' y no se pudo encontrar ningún método de extensión ''RemoveDetail'' que aceptara un primer argumento de tipo ''Principal'' (¿falta una directiva using o una referencia de ensamblado?)

Alguien tiene una sugerencia? ¿Tengo que actualizar todos los usos y hacer ReSharper para evitar este reemplazo?


Pude reproducir tu problema

public interface IDetail<T> { } public interface IMaster<T> { } public class MyClass { public void method() { Principal aPrincipal = new Principal(); aPrincipal.Permissions.Foreach(x => aPrincipal.RemoveDetail(x)); // No suggestion from resharper } } public class Permission : IDetail<Principal> { } public class Principal : IMaster<Permission> { public virtual IEnumerable<Permission> Permissions { get; } } public static class Class { public static void RemoveDetail<TMaster, TChild>(this TMaster master, TChild child) where TMaster : class, IMaster<TChild> where TChild : class, IDetail<TMaster> { } public static void Foreach<T>(this IEnumerable<T> source, Action<T> action) { } }

El resharper no sugiere nada. entonces probablemente tengas que actualizar tu Resharper a una versión más nueva. probablemente fue un error que está solucionado ahora.

Si esto no es como tú lo haces entonces tienes que poner más información.

También el compilador da el mismo error cuando intento convertirlo a un grupo de métodos. Entonces esta pregunta puede permanecer: ¿Por qué el compilador no puede hacer esto?

Editar:

Para solucionar este problema, debe llamar al método RemoveDetail desde dentro de Principal. así que haz que tu clase principal sea así.

public class Principal : IMaster<Permission> { public virtual IEnumerable<Permission> Permissions { get; } public void RemoveDetail(Permission p) { Class.RemoveDetail(this, p); } }

Creo que hay un tipo de compilador interno ambiguo (Posiblemente error) que no puede reconocer el método RemoveDetail . como el compilador intente encontrarlo dentro de Principal . para que pueda solucionarlo con la creación de RemoveDetail dentro de Principal y llame a un RemoveDetail estático desde allí.

Editar 2:

El problema es la restricción de tipo genérico.

where TMaster : class, IMaster<TChild>

Esto hace que el compilador observe la clase que implementa IMaster<TChild> y que es Principal . si elimina esta cláusula where, resolverá el problema. de lo contrario, el compilador espera que sea Principal .

Si usa lambda, elimina esta ambigüedad.

aPrincipal.RemoveDetail // compiler expects property/field/method in Principal // but compiler forgets method group and static generic method! x => aPrincipal.RemoveDetail(x) // this is no more like property or field //but a method that is considered static generic method!

Entonces, eso es un error de C # 6