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.

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top