Das Problem ist, dass demo1
ist kein einfacher Ausdruck, es ist eine Methode. Und Methoden können überschrieben werden, so ist es nicht tatsächlich eine Methode, es ist eine Methodengruppe. Betrachten Sie das folgende Beispiel:
public class Demo {
protected bool branch;
protected void demo1 (int) {}
protected void demo1() {}
protected void demo2() {}
public Action DoesntWork() {
return branch ? demo1 : demo2; //Error
return demo1; //ok
}
}
Nun demo1
ist überlastet, so das eine der beiden Versionen soll verwendet werden? Die Antwort ist, dass die überladene Funktion ausgewählt wird, indem der Kontext verwendet wird, in dem die Funktion verwendet wird.
In der return demo1
ist es offensichtlich, es erwartet eine Action
.
Aber in der return branch? demo1 : demo2;
ist der Kontext nicht so einfach. Der ternäre Operator versucht zunächst, den Typ demo1
mit dem von demo2
abzugleichen, aber das ist eine andere Methodengruppe, so dass es keine Hilfe gibt. Der Compiler schaut nicht darüber hinaus und schlägt fehl.
Die Lösung ist, die Art deutlich zu machen, aus der Methode Gruppe erwartet:
return branch? new Action(demo1) : demo2;
return branch? (Action)demo1 : demo2;
Action d1 = demo1;
return branch? d1 : demo2;
+1 zur Erklärung, warum die Typinferenz ausfällt, und dass Sie eine Besetzung statt 'new' verwenden können. –