Namespace scoped Aliase für generische Typen in C #
-
25-09-2019 - |
Frage
Lassen Sie uns haben folgendes Beispiel:
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
}
Der Compiler sagt:
Die Typargumente für Verfahren ‚System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable, System.Func ‚) kann nicht wird die aus der Nutzung zu entnehmen. Versuchen Angabe der Typargumente explizit.
Es ist, weil es nicht Bar
zu Func<IList<X>, int, IDictionary<Y, IList<Z>>>
umwandeln kann.
Es wäre toll, wenn ich Typ-Namespace scoped Aliase Typen für generische Typen in C # erstellen kann. Dann würde ich Bar
nicht als Delegierten definieren, sondern würde ich es definieren als ein Namespace alias für Func<IList<X>, int, IDictionary<Y, IList<Z>>>
scoped.
public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>;
Ich konnte dann auch Namespace scoped alias für beispielsweise definieren IDictionary<Y, IList<Z>>
.
Und wenn in geeigneter Weise verwendet :), wird es den Code besser lesbar machen. Nun, ich habe die generischen Typen inline und der eigentliche Code ist nicht gut lesbar: (
Haben Sie die gleichen Probleme finden :)? Gibt es einen guten Grund, warum es nicht in C # 3.0 ist? Oder gibt es keinen guten Grund, es ist nur ums Geld und / oder Zeit?
EDIT:. Ich weiß, dass ich using
verwenden können, aber es ist nicht Namespace scoped - nicht so bequem für meinen Fall
EDIT2. Siehe Kommentar von Joren wo er schlägt vor, dass strukturelle Typisierung auch das Problem lösen könnte
Lösung
Sie sind kein Glück; die using-Direktive wirkt sich nur auf seine aktuelle Datei. Es gibt keinen Namespace-weiten Typen Aliasing-Mechanismus.
Dies ist eine ziemlich häufig nachgefragte Funktion, die Punkte für sich ist. Aber es ist auch ein „nice to have“ Komfortmerkmal im Gegensatz zu einem, der wirklich viel Repräsentations Macht der Sprache hinzufügt, die Punkte dagegen ist. Es wäre schön zu tun, aber es ist nicht wirklich ganz oben auf der Prioritätenliste.
Andere Tipps
Wenn Sie das tun ...
var results = source.Select((x, i) => foo.Bar(x, i));
es kann die Typen für Sie herausfinden, ohne dass sie explizit angeben zu müssen.
(Zugegebenermaßen ist dies eher eine Behelfslösung als eine Lösung)