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

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top