Pregunta

Vamos a tener un siguiente ejemplo:

public class X { }
public class Y { }
public class Z { }

public delegate IDictionary<Y, IList<Z>> Bar(IList<X> x, int i);

public interface IFoo
{
    // ...
    Bar Bar { get; }
}

public class Foo : IFoo
{
    // ...
    public Bar Bar
    {
        get
        {
            return null; //...
        }
    }
}

void Main()
{
    IFoo foo; //= ...
    IEnumerable<IList<X>> source; //= ...
    var results = source.Select(foo.Bar); // <- compile error here
}

El compilador dice:

  

Los argumentos de tipo para el método   'System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable,   System.Func)' no puede   inferirse del uso. Tratar   especificando los argumentos de tipo   explícitamente.

Es porque, no se puede convertir a Bar Func<IList<X>, int, IDictionary<Y, IList<Z>>>.

Sería genial si pudiera crear el tipo de espacio de nombres con ámbito alias de tipo para los tipos genéricos en C #. Entonces yo definiría Bar no como un delegado, sino que lo definiría como un espacio de nombres con ámbito alias para Func<IList<X>, int, IDictionary<Y, IList<Z>>>.

public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>;

I podría entonces también definir alias de ámbito de espacio de nombres para, por ejemplo, IDictionary<Y, IList<Z>>.

Y si se utiliza adecuadamente :), que hará que el código sea más legible. Ahora, tengo que inline los tipos genéricos y el código real no es bien legible: (

¿Usted se encuentra el mismo problema :)? ¿Hay alguna razón buena razón por la que no se encuentra en C # 3.0? O si no hay una buena razón, es sólo cuestión de dinero y / o tiempo?

EDIT:. Sé que puedo usar using, pero no está scoped espacio de nombres - no es tan conveniente para mi caso

Edit2:. Ver por Joren donde se sugiere que la tipificación estructural también podría resolver el problema

¿Fue útil?

Solución

Usted está fuera de suerte; la directiva using sólo afecta a su archivo actual. No existe un mecanismo de tipo aliasing en todo el espacio de nombres.

Esta es una característica bastante solicitado con frecuencia, que es puntos por ello. Pero también es un "bueno tener" característica de conveniencia en lugar de uno que realmente se suma una gran cantidad de potencia de representación de la lengua, que es puntos en contra de ella. Sería bueno que hacer, pero no es muy alto en la lista de prioridades.

Otros consejos

Si lo hace ...

var results = source.Select((x, i) => foo.Bar(x, i));

puede averiguar los tipos para usted sin tener que especificar explícitamente.

(Es cierto que esto es más de un trabajo en torno a una solución)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top