Aufrufwandlung in C♯
Beispiel
Im folgenden Beispiel wird die Methode »global::System.Math.Cos« mit einem Argument vom Typ »int« aufgerufen, obwohl sie einen Parameter vom Typ »double« hat.
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Cos( 0 ) ); }}global::System.Console.Out
1
- »msdn.microsoft.com/library/system.math.cos« (vereinfacht und übersetzt)
- Namensraum »global::System«
- Klasse »Math«
Double Cos(Double)
- Ergibt des Argumentwerts Kosinus.
Erklärung
Eine Methode mit einem double-Parameter kann in der Regel auch mit einem Argumentausdruck vom Typ »int« aufgerufen werden. Dessen Wert wird dann bei Bedarf implizit (also automatisch/stillschweigend) nach »double« gewandelt wird.
Eine Typwandlung ist eine Darstellung eines Wertes eines Typs durch einen Wert eines anderen Typs, der ihm als genau oder näherungsweise gleich angesehen wird. Beispielsweise kann der int-Wert »2« durch den double-Wert »2.0« dargestellt werden.
Implizite Typwandlungen
Bestimmte Typwandlungen werden stillschweigend vorgenommen. Diese werden implizite Typwandlungen genannt.
Beim Aufruf einer Methode wird der Argumentwert in den Parametertyp gewandelt, falls es eine implizite Typwandlung in den Parametertyp gibt. Hierfür kommen die folgenden Wandlungen in Frage:
- eine Wandlung von einem Wert eines Typs in denselben Typ sowie
- eine Wandlung eines int-Werts in den Typ »double« oder »decimal«.
Beim Aufruf der Funktion »global::System.Math.Cos« mit einem int-Argument ist die Typwandlung in den Parametertype »double« implizit und wird deswegen bei der Auswertung des Aufrufausdrucks stillschweigend vorgenommen.
Die folgende Tabelle zeigt, welche Argumenttypen für bestimmte Parametertypen zulässig sind.
- Tabelle
Parametertyp erlaubter Argumenttyp
double double, int
decimal decimal, int
int int
string string
Bestimmte Typwandlungen sind implizit, weil sie nicht zu einem Verlust wesentlicher Informationen führen. Daher bedürfen sie nicht der Aufmerksamkeit des Programmierers, der sonst entscheiden müßte, ob eine verlustbehaftete Wandlung vorgenommen werden soll und welche Informationen dabei gegebenenfalls verloren gehen können.
Beispiel
In dem folgenden Beispiel wird die Methode »global::System.Char.ConvertFromUtf32« mit einem Argument vom Typ »double« aufgerufen, obwohl sie einen Parameter vom Typ »int« hat. Da es keine implizite Typwandlung von »double« nach »int« gibt, wird eine Fehlermeldung ausgegeben.
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Char.ConvertFromUtf32( 64.5 ) ); }}Protokoll
Program.cs(4,45): error CS1503: Argument 1: cannot convert from 'double' to 'int'
- »msdn.microsoft.com/library/system.char.convertfromutf32« (vereinfacht und übersetzt)
- Namensraum »global::System«
- Struktur »Char«
public static string ConvertFromUtf32( int utf32 )
- Ergibt eine Zeichenfolge mit dem angegebenen Unicode -CodePunkt.
Bei einer Wandlung eines double-Werts in einen int-Wert könnten wesentliche Informationen verloren gehen, weswegen solch ein Typwandlung nicht implizit vorgenommen wird.
Übungsfragen _
Die Proklamation ist der Teil der Dokumentation einer Methode, welcher an ihrem Anfang steht und meist in einer dicktengleichen Schrift (Schreibmaschinenschrift) erscheint.
Wir sagen, daß ein Aufruf zu einer Proklamation „paßt“, wenn angesichts der Informationen, die man der Proklamation entnehmen kann, keine Fehlermeldung bei Verwendung des Aufrufs zu erwarten ist.
Zur Vereinfachung lassen wir bei den folgenden Übungsfragen den Namen der Klasse sowohl in der Dokumentation als auch bei dem Aufruf weg. Es wird immer angenommen, daß der Aufruf bei Verwendung zulässiger Argumente ein Aufruf der dokumentierten Methoden ist.
? Quelltext beurteilen (0) _
Paßt der Aufruf zur Proklamation?
- Proklamation einer Methode (erfundenes Beispiel)
static double f( double x )
- Aufruf einer Methode
f( 2.3 )
? Quelltext beurteilen (1) _
Paßt der Aufruf zur Proklamation?
- Proklamation einer Methode (erfundenes Beispiel)
static double f( double x )
- Aufruf einer Methode
f( 2 )
? Quelltext beurteilen (2) _
Paßt der Aufruf zur Proklamation?
- Proklamation einer Methode (erfundenes Beispiel)
static double f( double x )
- Aufruf einer Methode
f( "2.3" )
? Ausdrücke beurteilen _
Welcher der folgenden Aufrufe ist erlaubt?
- »global::Microsoft.JScript.MathObject.random( 1 )«
- »global::Microsoft.JScript.MathObject.random( 1.0 )«
- »global::Microsoft.JScript.MathObject.random( "1.0" )«
- »global::System.Math.Log( 1 )«
- »global::System.Math.Log( 1.0 )«
- »global::System.Math.Log( "1.0" )«
- »msdn.microsoft.com/library/microsoft.jscript.mathobject.random« (gekürzt, überarbeitet und übersetzt)
- Erzeugt eine Zufallszahl zwischen Null und Eins.
- Syntax
public static double random()
- Dokumentation von »global::System.Math.Log« (gekürzt, vereinfacht und übersetzt)
- Ergibt den natürlichen Logarithmus des Argumentwertes.
- Syntax
public static double Log( double d )
? Übungsfrage
Das folgende Programm veranlaßt den C♯ -Übersetzer zur Ausgabe einer Fehlermeldung, die eine Beschreibung des Parameters der Methode »global::System.Char.ConvertFromUtf32« enthält und eine Beschreibung des tatsächlich verwendeten Arguments enthält (Stand 2018).
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Char.ConvertFromUtf32( 64.5 ) ); }}Protokoll
Program.cs(4,45): error CS1503: Argument 1: cannot convert from 'double' to 'int'
Was kann man der Fehlermeldung über den Parametertyp entnehmen?
Was kann man der Fehlermeldung über den Argumenttyp entnehmen?
Quellen
- Quelle *
- “An identity conversion converts from any type to the same type ” (is an implicit conversion)
- “The implicit numeric conversions are: ” … “From int to ” … “double or decimal ”
- Abschnitt “Implicit numeric conversions ” in “C# Language Specification Version 5.0 ”
- Quelle *
- “For a value parameter, the argument expression is evaluated and an implicit conversion to the corresponding parameter type is performed. The resulting value becomes the initial value of the value parameter in the function member invocation. ”
- Abschnitt “Argument lists ” in “C# Language Specification Version 5.0 ”