explicit (Referencia de C#)
La palabra clave explicit declara un operador de conversión de tipos definido por el usuario que se debe invocar con una conversión de tipos.Por ejemplo, este operador convierte una clase denominada Fahrenheit en una clase denominada Celsius:
// Must be defined inside a class called Fahrenheit:
public static explicit operator Celsius(Fahrenheit fahr)
{
return new Celsius((5.0f / 9.0f) * (fahr.degrees - 32));
}
El operador de conversión se puede invocar así:
Fahrenheit fahr = new Fahrenheit(100.0f);
Console.Write("{0} Fahrenheit", fahr.Degrees);
Celsius c = (Celsius)fahr;
El operador de conversión convierte un tipo de origen en un tipo de destino.El tipo de origen proporciona el operador de conversión.A diferencia de la conversión implícita, los operadores de conversión explícita deben invocarse mediante una conversión de tipo (cast).Si una operación de conversión puede producir excepciones o pérdida de información, debe marcarse como explicit.De esta forma, se evita que el compilador realice la conversión automáticamente y se produzcan posibles consecuencias no deseadas.
Omitir los resultados de conversión del error en tiempo de compilación CS0266.
Para obtener más información, vea Utilizar operadores de conversión (Guía de programación de C#).
Ejemplo
El ejemplo siguiente proporciona una clase Fahrenheit y una clase Celsius, cada una de las cuales proporciona un operador de conversión explícito a la otra clase.
class Celsius
{
public Celsius(float temp)
{
degrees = temp;
}
public static explicit operator Fahrenheit(Celsius c)
{
return new Fahrenheit((9.0f / 5.0f) * c.degrees + 32);
}
public float Degrees
{
get { return degrees; }
}
private float degrees;
}
class Fahrenheit
{
public Fahrenheit(float temp)
{
degrees = temp;
}
// Must be defined inside a class called Fahrenheit:
public static explicit operator Celsius(Fahrenheit fahr)
{
return new Celsius((5.0f / 9.0f) * (fahr.degrees - 32));
}
public float Degrees
{
get { return degrees; }
}
private float degrees;
}
class MainClass
{
static void Main()
{
Fahrenheit fahr = new Fahrenheit(100.0f);
Console.Write("{0} Fahrenheit", fahr.Degrees);
Celsius c = (Celsius)fahr;
Console.Write(" = {0} Celsius", c.Degrees);
Fahrenheit fahr2 = (Fahrenheit)c;
Console.WriteLine(" = {0} Fahrenheit", fahr2.Degrees);
}
}
// Output:
// 100 Fahrenheit = 37.77778 Celsius = 100 Fahrenheit
El siguiente ejemplo define un struct, Digit, que representa un único dígito decimal.Se define un operador para conversiones de byte a Digit, pero como no todos los bytes se pueden convertir en Digit, la conversión es explícita.
struct Digit
{
byte value;
public Digit(byte value)
{
if (value > 9)
{
throw new ArgumentException();
}
this.value = value;
}
// Define explicit byte-to-Digit conversion operator:
public static explicit operator Digit(byte b)
{
Digit d = new Digit(b);
Console.WriteLine("conversion occurred");
return d;
}
}
class ExplicitTest
{
static void Main()
{
try
{
byte b = 3;
Digit d = (Digit)b; // explicit conversion
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
}
}
/*
Output:
conversion occurred
*/
Especificación del lenguaje C#
Para obtener más información, vea la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.
Vea también
Tareas
Cómo: Implementar conversiones entre structs definidos por el usuario (Guía de programación de C#)
Referencia
Conceptos
Otros recursos
Conversiones explícitas definido por el usuario encadenadas en C#