Aliases com escopo para namespace para tipos genéricos em C#
-
25-09-2019 - |
Pergunta
Vamos ter um exemplo a seguir:
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
}
O compilador diz:
Os argumentos de tipo para o método 'System.Linq.enumerable.Select (System.Collection.Genic.ienumerable, System.func)' não podem ser inferidos a partir do uso. Tente especificar explicitamente os argumentos do tipo.
É porque, não pode converter Bar
para Func<IList<X>, int, IDictionary<Y, IList<Z>>>
.
Seria ótimo se eu pudesse criar aliases de tipo de namespace de tipo de nomes para tipos genéricos em C#. Então eu definiria Bar
não como um delegado, mas sim, eu o definiria como um pseudônimo de namespace scoped Func<IList<X>, int, IDictionary<Y, IList<Z>>>
.
public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>;
Eu também poderia definir pseudônimo de namespace para o nome de nome por exemplo IDictionary<Y, IList<Z>>
.
E se usado adequadamente :), ele tornará o código mais legível. Agora, tenho que embunhar os tipos genéricos e o código real não é bem legível :(
Você encontrou o mesmo problema :)? Existe alguma boa razão para que não esteja no C# 3.0? Ou não há uma boa razão, é apenas uma questão de dinheiro e/ou tempo?
Editar: eu sei que posso usar using
, mas não é um espaço para o nome de nome - não é tão conveniente para o meu caso.
Edit2: Veja Comentário de Joren onde ele sugere que a digitação estrutural também pode resolver o problema.
Solução
Você não está com sorte; A diretiva de uso afeta apenas seu arquivo atual. Não há mecanismo de aliasing do tipo namespace.
Este é um recurso solicitado com bastante frequência, que é pontos para ele. Mas também é um recurso de conveniência "bom ter", em oposição a um que realmente adiciona muito poder representacional ao idioma, que é pontos contra ele. Seria bom fazer, mas não está realmente no topo da lista de prioridades.
Outras dicas
Se você fizer ...
var results = source.Select((x, i) => foo.Bar(x, i));
Ele pode descobrir os tipos para você sem precisar especificá -los explicitamente.
(É certo que isso é mais uma volta do que uma solução)