2016-04-15 3 views
14

ich ähnlich dem folgenden in meinem Code versehentlich über etwas gestolpert, kompiliert es in Ordnung, aber dann offenbar Bomben zur Laufzeit:Warum lässt der Compiler Convert.ToString() einer Ganzzahl zu?

dynamic fiftySixDynamic = 56; 
int fiftySixInt = System.Convert.ToString(fiftySixDynamic); 

Jede Überlastung von Convert.ToString() einen String zurückgibt, so sicher diese shouldn Kompilieren? Was ist denn hier los?

+1

Meine Empfehlung ist das post als Bug .. ich bin nicht wirklich sicher, an welchem ​​Ort es von der Hand gehen würde. –

+3

@ChrisMarisic Dies ist genau das, was es tun soll. Wenn es * nicht * kompiliert * wäre, wäre das ein Fehler. – Servy

+2

Dies hebt eine Schwäche in C# hervor - es ist dem Programmierer nicht klar, welche Ausdrücke die Typprüfung ausgeschaltet haben. Die Sprachdesigner haben es besser mit unsicheren {} – buffjape

Antwort

36

Sie verwenden dynamic für den Eingang zu Convert.ToString. Da eine Eingabe dynamic ist, wird die Methodenbindung und Typprüfung auf die Laufzeit verschoben, sodass der Compiler nicht erkennt, dass der einzig mögliche Rückgabetyp string ist. Der Compiler stoppt zu diesem Zeitpunkt grundsätzlich alle Bindungen und Typprüfungen.

Auch wenn Sie fiftySixInt = fiftySixDynamic.ToString() genannt, die nicht eine Überlastung, die eine int zurückkommt, würden Sie keine Warnung vom Compiler erhalten.

Eine Möglichkeit Kompilierung-Fehler für dynamische Verhalten erlauben und dennoch zu vermeiden, ist die Rückkehr zu werfen:

int fiftySixInt = (string)System.Convert.ToString(fiftySixDynamic); 

Es sieht überflüssig, aber es weist den Compiler den Rückgabewert als string für die Behandlung Bindung Zwecke. Die Methode ist zur Laufzeit immer noch gebunden. Wenn also der Rückgabetyp nicht eine Zeichenfolge ist, erhalten Sie eine Laufzeitausnahme, aber nachgeordnete Methoden werden zur Kompilierungszeit gebunden.

+0

Interessant! Es ist überraschend, dass es in Visual Studio keine Warnung gab, nichts von ReSharper etc! – JMK

+3

@JMK Darin liegt die Kraft und die Gefahr der "Dynamik". –

+6

@JMK Sie sind überrascht, als Sie den Compiler ausgeschaltet haben und ihm gesagt haben, dass er keinen Typ überprüft, dass er Sie nicht darüber informiert, dass Sie einen Vorgang ausführen, der für einen bestimmten Typ nicht gültig ist? Wenn der Compiler Ihnen mitteilen soll, ob die Typen einer Operation gültig sind, schalten Sie sie nicht aus. – Servy

Verwandte Themen