2013-05-09 7 views
6

Dies ist wahrscheinlich eine einfache Erklärung hat zu sehen, ich bin versagt, aber warum ist der folgende Code legal:dynamisches Feld const gegen alle alten Referenzfeld const Verhalten

public struct Foo 
    { 
     const object nullObject = null; 

     public override string ToString() 
     { 
      if (nullObject == null) 
      { 
       return base.ToString(); 
      } 

     } 
    } 

Während der folgenden

public struct Foo 
    { 
     const dynamic nullObject = null; 

     public override string ToString() 
     { 
      if (nullObject == null) 
      { 
       return base.ToString(); 
      } 

     } 
    } 

gibt den folgenden Kompilierzeitfehler: Foo.ToString() ': nicht alle Codepfade geben einen Wert zurück?

Warum hat die Tatsache, dass nullObject sein dynamic macht der Compiler nicht in der Lage sein, zu behaupten, dass nullObject immer null sein wird?

EDIT: auf die Frage erweitern, und basierend auf smoore's Antwort, warum der Compiler erlauben dynamicconst Felder zu beginnen? Ist es nicht Selbstbeseitigung? Ich weiß, dass dieses Szenario überhaupt keine wirkliche Anwendung hat und es ist ehrlich gesagt ziemlich sinnlos, aber ich bin zufällig auf sie gestoßen und bin einfach neugierig geworden.

+1

'Warum erlaubt der Compiler das Starten von dynamischen const-Feldern?' Da es technisch möglich ist, 'const' auf alle Arten von Feldern anzuwenden. Wie bei jedem Feature lautet die Frage nicht "Warum haben sie dieses Feature nicht implementiert, das ich möchte?" es ist "warum sollten sie diese Funktion implementieren, die ich will?" In diesem Fall soll das Merkmal explizit verbieten, dass ein "const" -Feld "dynamisch" ist. Wie bei den meisten Feature-Anfragen wäre die Antwort höchstwahrscheinlich "es ist einfach nicht die Zeit und der Aufwand wert; es gab wichtigere Features hinzuzufügen". Das geht ziemlich weit weg, um dich in den Fuß zu schießen. – Servy

Antwort

6

Da dynamic Objekte werden nicht bei der Kompilierung aufgelöst, so dass die Compiler keine Ahnung haben, dass es immer null sein wird. Das dynamische Objekt wird erst zur Laufzeit aufgelöst.

EDIT:

ich Ihre Verwirrung zu sehen, warum auch eine const dynamische erlauben?

Meine Vermutung ist, dass die Dynamik auf einen Nicht-Nullable-Typen geändert werden könnte, wobei in diesem Fall ToString keinen Wert zurückgeben würde, aber das ist nur eine Vermutung. Ich denke auch, dass Sie immer noch die Möglichkeit haben möchten, eine konstante Dynamik zu haben, so dass Sie sicherstellen können, dass sich der Wert außerhalb des statischen Konstruktors nicht ändert, aber den Typ erst zur Laufzeit kennt.

Eine andere Möglichkeit, wie Servy hervorhebt, ist, dass es so ein Eckfall ist, dass es sich nicht lohnt, es zu reparieren.

+0

Ich verstehe das, aber warum lassen 'dynamische' 'const' Felder damit anfangen? Der springende Punkt ist, dass "const" nicht statischer sein kann. – InBetween

+0

@Tejas: Nein, dieser Code wird nicht kompiliert. Referenz-Const-Felder können nur mit 'null' initialisiert werden, mit Ausnahme von' string', das immer eine spezielle 'Klasse' war. Werttypen können nur mit konstanten Ausdrücken initialisiert werden. – InBetween

+0

@Tejas Außer dass 'const' Werte zur Kompilierzeit ausgewertet werden müssen, können sie keine Methoden aufrufen. –