Delen via


Door de gebruiker gedefinieerde expliciete en impliciete conversieoperators

Een door de gebruiker gedefinieerd type kan een aangepaste impliciete of expliciete conversie van of naar een ander type definiëren. Voor impliciete conversies hoeft geen speciale syntaxis te worden aangeroepen en kunnen zich in verschillende situaties voordoen, bijvoorbeeld in toewijzingen en methoden aanroepen. Vooraf gedefinieerde impliciete C#-conversies slagen altijd en genereren nooit een uitzondering. Door de gebruiker gedefinieerde impliciete conversies moeten zich ook op die manier gedragen. Als een aangepaste conversie een uitzondering kan genereren of gegevens kan verliezen, definieert u deze als een expliciete conversie.

Door de gebruiker gedefinieerde conversies worden niet als operatoren beschouwd. Gebruik een cast-expressie om een door de gebruiker gedefinieerde expliciete conversie aan te roepen.

Gebruik respectievelijk de operator en implicit of explicit trefwoorden om een impliciete of expliciete conversie te definiëren. Het type dat een conversie definieert, moet een brontype of een doeltype van die conversie zijn. Een conversie tussen twee door de gebruiker gedefinieerde typen kan worden gedefinieerd in een van de twee typen.

In het volgende voorbeeld ziet u hoe u een impliciete en expliciete conversie definieert:

using System;

public readonly struct Digit
{
    private readonly byte digit;

    public Digit(byte digit)
    {
        if (digit > 9)
        {
            throw new ArgumentOutOfRangeException(nameof(digit), "Digit cannot be greater than nine.");
        }
        this.digit = digit;
    }

    public static implicit operator byte(Digit d) => d.digit;
    public static explicit operator Digit(byte b) => new Digit(b);

    public override string ToString() => $"{digit}";
}

public static class UserDefinedConversions
{
    public static void Main()
    {
        var d = new Digit(7);

        byte number = d;
        Console.WriteLine(number);  // output: 7

        Digit digit = (Digit)number;
        Console.WriteLine(digit);  // output: 7
    }
}

Vanaf C# 11 kunt u gecontroleerde expliciete conversieoperators definiëren. Zie de sectie Door de gebruiker gedefinieerde operators van het artikel Rekenkundige operators voor meer informatie.

U gebruikt ook het operator trefwoord om een vooraf gedefinieerde C#-operator te overbelasten. Zie Overbelasting van operatoren voor meer informatie.

C#-taalspecificatie

Zie de volgende secties van de C#-taalspecificatie voor meer informatie:

Zie ook