Användardefinierade explicita och implicita konverteringsoperatorer

En användardefinierad typ kan definiera en anpassad implicit eller explicit konvertering från eller till en annan typ. Implicita konverteringar kräver inte att särskild syntax anropas och kan inträffa i olika situationer, till exempel i tilldelningar och metoder. Fördefinierade implicita C#-konverteringar lyckas alltid och utlöser aldrig ett undantag. Användardefinierade implicita konverteringar bör också fungera på det sättet. Om en anpassad konvertering kan utlösa ett undantag eller förlora information definierar du det som en explicit konvertering.

Användardefinierade konverteringar beaktas inte av is och som operatorer. Använd ett cast-uttryck för att anropa en användardefinierad explicit konvertering.

Använd nyckelorden operator och implicit eller explicit för att definiera en implicit eller explicit konvertering. Den typ som definierar en konvertering måste vara antingen en källtyp eller en måltyp för konverteringen. En konvertering mellan två användardefinierade typer kan definieras i någon av de två typerna.

I följande exempel visas hur du definierar en implicit och explicit konvertering:

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
    }
}

Från och med C# 11 kan du definiera markerade explicita konverteringsoperatorer. Mer information finns i avsnittet Användardefinierade kontrollerade operatorer i artikeln Aritmetiska operatorer .

Du använder också nyckelordet operator för att överbelasta en fördefinierad C#-operator. Mer information finns i Operatoröverlagring.

Språkspecifikation för C#

Mer information finns i följande avsnitt i C#-språkspecifikationen:

Se även