C# Language Opérateurs de diffusion implicite et de distribution explicite


Exemple

C # permet aux types définis par l'utilisateur de contrôler l'affectation et la diffusion via l'utilisation des mots clés explicit et implicit . La signature de la méthode prend la forme:

public static <implicit/explicit> operator <ResultingType>(<SourceType> myType)

La méthode ne peut pas prendre plus d'arguments, ni être une méthode d'instance. Il peut cependant accéder à tous les membres privés de type défini dans le document.

Un exemple à la fois d'une distribution implicit et explicit :

public class BinaryImage 
{
    private bool[] _pixels;

    public static implicit operator ColorImage(BinaryImage im)
    {
        return new ColorImage(im);
    }

    public static explicit operator bool[](BinaryImage im)
    {
        return im._pixels;
    }
}

Permettant la syntaxe de distribution suivante:

var binaryImage = new BinaryImage();
ColorImage colorImage = binaryImage; // implicit cast, note the lack of type 
bool[] pixels = (bool[])binaryImage; // explicit cast, defining the type

Les opérateurs de distribution peuvent travailler dans les deux sens, en allant de votre type à votre type:

public class BinaryImage
{
    public static explicit operator ColorImage(BinaryImage im)
    {
        return new ColorImage(im);
    }

    public static explicit operator BinaryImage(ColorImage cm)
    {
        return new BinaryImage(cm);
    }
}

Enfin, le mot-clé as , qui peut être utilisé pour la conversion au sein d'une hiérarchie de types, n'est pas valide dans cette situation. Même après avoir défini une distribution explicit ou implicit , vous ne pouvez pas faire:

ColorImage cm = myBinaryImage as ColorImage;

Cela générera une erreur de compilation.