Domanda

Facciamo un esempio che segue:

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
}

Il compilatore dice:

  

Gli argomenti di tipo per il metodo   'System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable,   System.Func)' non è possibile   dedurre dall'uso. Provare   specificando gli argomenti di tipo   in modo esplicito.

E 'perché, non in grado di convertire Bar a Func<IList<X>, int, IDictionary<Y, IList<Z>>>.

Sarebbe bello se potessi creare tipo namespace ambito tipo alias per i tipi generici in C #. Poi vorrei definire Bar non come un delegato, ma piuttosto lo definirei come un namespace ambito alias per Func<IList<X>, int, IDictionary<Y, IList<Z>>>.

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

I potrebbe quindi definire anche namespace alias con ambito per esempio IDictionary<Y, IList<Z>>.

E se utilizzati in modo appropriato :), renderà il codice più leggibile. Ora, devo inline i tipi generici e il codice vero e proprio non è ben leggibile: (

Avere a trovare lo stesso problema :)? C'è qualche motivo buono per cui non è in C # 3.0? O non c'è motivo buono, è solo questione di soldi e / o il tempo?

EDIT:. So che posso usare using, ma non è namespace scoped - non è così conveniente per il mio caso

EDIT2:. Vedere da Joren in cui egli suggerisce che la tipizzazione strutturale potrebbe anche risolvere il problema

È stato utile?

Soluzione

Sei fuori di fortuna; la direttiva using riguarda solo il suo file corrente. Non v'è alcun meccanismo di tipo aliasing a livello di spazio dei nomi.

Questa è una caratteristica abbastanza frequentemente richiesto, che è i punti per esso. Ma è anche un "bello avere" caratteristica di praticità al contrario di quello che in realtà aggiunge un sacco di potere di rappresentanza al linguaggio, che è punti contro di essa. Sarebbe bello da fare, ma non è proprio in cima alla lista delle priorità.

Altri suggerimenti

Se lo fai ...

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

si può capire i tipi per voi senza dover specificare in modo esplicito.

(Certo questo è più di un work-around che una soluzione)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top