Aufrufwandlung in C# (Aufrufwandlung in C#), Lektion, Seite 723273
https://www.purl.org/stefan_ram/pub/aufrufwandlung_csharp (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C#-Kurs

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:

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?

»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 

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723273 stefan_ram:723273 Aufrufwandlung in C# Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723273, slrprddef723273, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/aufrufwandlung_csharp