2012-12-12 2 views
9

Der folgende Code mit Warnung und Intellisense Fehler kompiliert:Wie kann man auf C++/CLI initonly TimeSpan Feld richtig zugreifen?

ref class Test { 
    initonly static TimeSpan Delay = TimeSpan(1,1,1); 

    Test() { 
     long long ticks = Delay.Ticks; // << problem 
    } 
}; 

Die Probleme sind:

  • Warnung C4395: 'System :: :: Timespan Ticks :: get': Member-Funktion wird sein aufgerufen auf einer Kopie des initonly Data-Member ‚Test :: Verzögerung‘
  • IntelliSense: die Adresse eines initonly Spielfelds ist nicht erlaubt

Wie kann ich richtig auf Zecken zugreifen?

Antwort

11

Nun, das ist ziemlich wichtig Fail-Wal. Die Warnung ist korrekt, der Compiler weiß nicht genug über den TimeSpan :: Tick-Eigenschaft Getter. Es kann nicht sicherstellen, dass der Getter nichts tut, was den Wert der Struktur ändern könnte, und dadurch den initonly Vertrag ungültig macht. Es löst es, indem es eine Kopie der Struktur erstellt und davor warnt, da dies ein mögliches Perf-Problem ist. Das ist etwas umständlich, andere gemanagte Compiler machen die Kopie, ohne etwas darüber zu sagen. Ich würde einfach einen #pragma warning(disable:4395) vor ihm plotten, damit die Warnung unterdrückt wird.

Die IntelliSense-Fehler wird nur angezeigt, wenn ich versuche, dies in VS2012. Das ist ein Fehler. Sie können es unter connect.microsoft.com melden.

Angesichts der Misere und das scheint, um ein Mitglied der privaten Klasse zu sein, würde ich einfach initonly fallen, um weiter zu kommen. Wenn das nicht erwünscht ist, dann können Sie das Feld mit einer Eigenschaft wickeln, absichtlich die Kopie zu erstellen und damit beider Probleme loszuwerden, wie folgt aus:

ref class Test { 
    initonly static TimeSpan _delay = TimeSpan(1,1,1); 
    static property TimeSpan Delay { 
     TimeSpan get() { return _delay; } 
    } 

    Test() { 
     long long ticks = Delay.Ticks; 
    } 
}; 

Der Jitter-Optimierer es wird also keine Sorgen loswerden über den Kopf.

+0

Diese Warnung ist in VS2015 immer noch vorhanden. – shoelzer