Spazio dei nomi ambito alias per i tipi generici in C #
-
25-09-2019 - |
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
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)