Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[Tutoria] C# Conversaciones Indefinidas por El Usuario
#1


Tutorial de conversiones definidas por el usuario
Visual Studio .NET 2003
Este tutorial muestra cómo definir y utilizar conversiones hacia o desde clases o estructuras.

Archivos de ejemplo

Vea Ejemplo de conversiones definidas por el usuario para descargar y generar los archivos de ejemplo que se utilizan en este tutorial.

Información adicional

explicit
implicit
Operador ()
Tabla de conversiones numéricas implícitas
operator
6.4 Conversiones definidas por el usuario
6.4.4 Conversiones explícitas definidas por el usuario
Tutorial

C# permite a los programadores declarar conversiones de clases o estructuras para convertirlas en otras clases o estructuras o en tipos básicos. Las conversiones se definen como operadores con el nombre del tipo al cual convierten.

En C#, las conversiones se pueden declarar bien como declaraciones implícitas (implicit), las cuales se producen automáticamente cuando son necesarias, o bien como declaraciones explícitas (explicit), que requieren que se invoque una conversión explícita. Todas las conversiones deben ser static, y pueden recibir el tipo sobre el que está definida la conversión o bien devolver ese tipo.

Este tutorial presenta dos ejemplos. El primer ejemplo muestra cómo declarar y utilizar conversiones, mientras que el segundo ejemplo ilustra las conversiones entre estructuras.

Ejemplo 1

En este ejemplo, se declara un tipo RomanNumeral y se definen varias conversiones hacia y desde él.

// conversion.cs
using System;

struct RomanNumeral
{
public RomanNumeral(int value)
{
this.value = value;
}
// Declare a conversion from an int to a RomanNumeral. Note the
// the use of the operator keyword. This is a conversion
// operator named RomanNumeral:
static public implicit operator RomanNumeral(int value)
{
// Note that because RomanNumeral is declared as a struct,
// calling new on the struct merely calls the constructor
// rather than allocating an object on the heap:
return new RomanNumeral(value);
}
// Declare an explicit conversion from a RomanNumeral to an int:
static public explicit operator int(RomanNumeral roman)
{
return roman.value;
}
// Declare an implicit conversion from a RomanNumeral to
// a string:
static public implicit operator string(RomanNumeral roman)
{
return("Conversion not yet implemented");
}
private int value;
}

class Test
{
static public void Main()
{
RomanNumeral numeral;

numeral = 10;

// Call the explicit conversion from numeral to int. Because it is
// an explicit conversion, a cast must be used:
Console.WriteLine((int)numeral);

// Call the implicit conversion to string. Because there is no
// cast, the implicit conversion to string is the only
// conversion that is considered:
Console.WriteLine(numeral);

// Call the explicit conversion from numeral to int and
// then the explicit conversion from int to short:
short s = (short)numeral;

Console.WriteLine(s);
}
}
Resultado

10
Conversion not yet implemented
10
Ejemplo 2

Este ejemplo define dos estructuras, RomanNumeral y BinaryNumeral, y muestra dos conversiones entre ellas.

// structconversion.cs
using System;

struct RomanNumeral
{
public RomanNumeral(int value)
{
this.value = value;
}
static public implicit operator RomanNumeral(int value)
{
return new RomanNumeral(value);
}
static public implicit operator RomanNumeral(BinaryNumeral binary)
{
return new RomanNumeral((int)binary);
}
static public explicit operator int(RomanNumeral roman)
{
return roman.value;
}
static public implicit operator string(RomanNumeral roman)
{
return("Conversion not yet implemented");
}
private int value;
}

struct BinaryNumeral
{
public BinaryNumeral(int value)
{
this.value = value;
}
static public implicit operator BinaryNumeral(int value)
{
return new BinaryNumeral(value);
}
static public implicit operator string(BinaryNumeral binary)
{
return("Conversion not yet implemented");
}
static public explicit operator int(BinaryNumeral binary)
{
return(binary.value);
}

private int value;
}

class Test
{
static public void Main()
{
RomanNumeral roman;
roman = 10;
BinaryNumeral binary;
// Perform a conversion from a RomanNumeral to a
// BinaryNumeral:
binary = (BinaryNumeral)(int)roman;
// Performs a conversion from a BinaryNumeral to a RomanNumeral.
// No cast is required:
roman = binary;
Console.WriteLine((int)binary);
Console.WriteLine(binary);
}
}
Resultado

10
Conversion not yet implemented
Descripción del código

En el ejemplo anterior, la instrucción:
binary = (BinaryNumeral)(int)roman;
realiza una conversión de un RomanNumeral a un BinaryNumeral. Como no existe una conversión directa de RomanNumeral a BinaryNumeral, se utiliza una conversión explícita de un RomanNumeral a un int, y otra conversión explícita para convertir de un int a un BinaryNumeral.

Además, la instrucción:
roman = binary;
realiza una conversión de un BinaryNumeral a un RomanNumeral. Como RomanNumeral define una conversión implícita desde BinaryNumeral, no se requiere ninguna conversión explícita.


Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Cambiar idioma según país del usuario Tzar 5 475 31-10-2014, 11:41 PM
Último mensaje: Minikole
  Botón de donar con información de usuario Gonzalo 5 452 16-04-2014, 06:10 AM
Último mensaje: MaxHurbano
  Como crear una base da datos y un usuario en CPANEL Juliens 15 1,893 05-03-2013, 04:39 PM
Último mensaje: papi
  Detectar si el usuario apretó el botón me gusta facebook torgar22 7 1,530 04-03-2013, 03:58 PM
Último mensaje: torgar22
  Enviar email de confirmacion al registrar un usuario skipgame 2 2,446 16-04-2012, 07:54 PM
Último mensaje: luis70043
  [Tutoria] C# Implementación explícita de interfaces Postteandox 0 525 21-11-2011, 01:23 AM
Último mensaje: Postteandox
  [Tutoria] C# Eventos [Dificil] Postteandox 0 1,046 21-11-2011, 01:22 AM
Último mensaje: Postteandox



Usuarios navegando en este tema: 1 invitado(s)