Tengamos una siguiente ejemplo:Espacio de nombres con ámbito alias para tipos genéricos en C#
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 de método 'System.Linq.Enumerable.Select (Sistema .Collections.Generic.IEnumerable, System.Func) 'no se puede deducir del uso. Pruebe especificando los argumentos de tipo explícitamente.
Es porque, no puede convertir Bar
en Func<IList<X>, int, IDictionary<Y, IList<Z>>>
.
Sería grandioso si pudiera crear tipos alias de tipo de espacio de espacios de tipo genérico en C#. Entonces definiría Bar
no como un delegado, sino que lo definiría como un alias de ámbito de espacio de nombres para Func<IList<X>, int, IDictionary<Y, IList<Z>>>
.
public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>;
entonces podría definir también espacio de nombres de ámbito alias para, por ejemplo, IDictionary<Y, IList<Z>>
.
Y si se usa apropiadamente :), hará que el código sea más legible. Ahora, tengo que alinear los tipos genéricos y el código real no es bien legible :(
¿Has encontrado el mismo problema :)? ¿Hay alguna buena razón por la cual no está en C# 3.0? ¿O no hay una buena razón, es solo cuestión de dinero y/o tiempo?
EDITAR: Sé que puedo usar using
, pero no tiene un espacio de nombres con ámbito, no tan conveniente para mi caso.
EDIT2: Vea comment by Joren donde sugiere que la tipificación estructural también podría resolver el problema.
No estoy seguro de cuál es el problema con 'using', ya que no define un nuevo tipo, pero ¿no es eso lo que quieres? –
Como escribí, no es un espacio de nombres con ámbito, sino más bien un archivo con ámbito. Necesito usar el alias en los archivos y ensamblajes de cs. –