2 Stimmen

Warum kann der C#-Compiler nicht implizit auf `Foo foo = (int x) => x.ToString();` für den Delegatentyp `static delegate R Foo<I, R>(I i);` schließen?

class Program
{
    static delegate R Foo<I, R>(I i);

    static void Main(string[] args)
    {

        Foo<int, string> foo = (int x) => x.ToString();

        // Why can't the compiler IMPLICITLY infer the following declaration?
        //Foo foo = (int x) => x.ToString();
    }
}

EDIT 1: Der obige Code ist eigentlich nicht kompilierbar. Der Delegat ich definiert hat statische Modifikator, die nicht anwendbar ist!

4voto

LukeH Punkte 251752

Das hat nichts mit Typinferenz zu tun, sondern damit, dass es keinen solchen Typ gibt wie Foo . ( Foo<I,R> y Foo wenn es sie gäbe, sind für den Compiler zwei völlig unterschiedliche Typen).

Aus demselben Grund können Sie auch keine der folgenden Handlungen legal durchführen:

Dictionary d = new Dictionary<int, string>();
List l = new List<string>();
Func f = new Func<int, string>(i => i.ToString());

3voto

Brian Ball Punkte 11652

Denn Foo ist kein definierter Typ, aber Foo<,> ist ein definierter Typ.

*Entfernt var Vorschlag, da er nicht funktioniert...

2voto

mmx Punkte 400975

Die C#-Spezifikation besagt, dass Lambdas untypisiert Konstrukte (wie Methodengruppen ). Sie können sein umgewandelt zu kompatiblen Typen. Aus diesem Grund können Sie nicht schreiben var something = (SomeType a) => a;

Der Grund dafür ist, dass sie je nach Kontext als Ausdrucksbäume und Delegierte interpretiert werden können. Es gibt keine Möglichkeit zu wissen, was außerhalb eines bestimmten Kontexts beabsichtigt ist. Sie können einen Lambda-Ausdruck oder eine Methodengruppe nicht außerhalb eines Kontexts verwenden, in dem sie in etwas umgewandelt werden können.

C#-Sprachenspezifikation v4.0 (§1.4.12)

Anonyme Funktionsumwandlungen und Methodengruppenumwandlungen

Anonyme Funktionen und Methodengruppen haben an sich keine Typen, können aber implizit in Delegatentypen oder Ausdrucksbaumtypen konvertiert werden. Die Konvertierung anonymer Funktionen wird in §1.44 und die Konvertierung von Methodengruppen in §1.45 näher beschrieben.

1voto

Femaref Punkte 59547

Weil es keinen solchen Typ gibt Foo . Wenn Sie eine Variable eines bestimmten Typs deklarieren, müssen Sie auch ihre generischen Parameter definieren.

1voto

In diesem Beispiel funktioniert das gut:

F((int x) => x.ToString());     
private static void F<I,R>(Foo<I, R> foo)
{
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X