перегрузка явного оператора CAST - PullRequest
5 голосов
/ 09 января 2012

У меня есть этот кусок кода:

public class Leg : ProxiestChild
{
    public virtual Name { get; set; }
}

проблема:

var leg = new Leg(); // leg is not Leg, instead ProxiedLeg

var trueleg = (Leg)leg; // exception leg is a ProxiedLeg

Мне нужно что-то вроде этого

public class ProxiestChild
{
    // some method that overloads explicit CAST
    // where receiving the proxied object i returns the unproxied object
    // to be casted
}

1 Ответ

13 голосов
/ 12 января 2012

Пользовательское преобразование типов можно реализовать с помощью операторов преобразования implicit или explicit.

Операторы преобразования могут быть явными или неявными.Операторы неявного преобразования проще в использовании, но явные операторы полезны, если вы хотите, чтобы пользователи оператора знали, что происходит преобразование.В этом разделе описываются оба типа.

Пример

Это пример явного оператора преобразования.Этот оператор преобразует из типа Byte в тип значения с именем Digit.Поскольку не все байты могут быть преобразованы в цифру, преобразование является явным, что означает, что необходимо использовать приведение, как показано в методе Main.

struct Digit
{
    byte value;

    public Digit(byte value)  //constructor
    {
        if (value > 9)
        {
            throw new System.ArgumentException();
        }
        this.value = value;
    }

    public static explicit operator Digit(byte b)  // explicit byte to digit conversion operator
    {
        Digit d = new Digit(b);  // explicit conversion

        System.Console.WriteLine("Conversion occurred.");
        return d;
    }
}

class TestExplicitConversion
{
    static void Main()
    {
        try
        {
            byte b = 3;
            Digit d = (Digit)b;  // explicit conversion
        }
        catch (System.Exception e)
        {
            System.Console.WriteLine("{0} Exception caught.", e);
        }
    }
}
// Output: Conversion occurred.

В этом примере демонстрируется оператор неявного преобразования путем определенияоператор преобразования, отменяющий то, что делал предыдущий пример: он преобразует класс значения с именем Digit в целочисленный тип Byte .Поскольку любая цифра может быть преобразована в байт , нет необходимости заставлять пользователей явно указывать преобразование.

struct Digit
{
    byte value;

    public Digit(byte value)  //constructor
    {
        if (value > 9)
        {
            throw new System.ArgumentException();
        }
        this.value = value;
    }

    public static implicit operator byte(Digit d)  // implicit digit to byte conversion operator
    {
        System.Console.WriteLine("conversion occurred");
        return d.value;  // implicit conversion
    }
}

class TestImplicitConversion
{
    static void Main()
    {
        Digit d = new Digit(3);
        byte b = d;  // implicit conversion -- no cast needed
    }
}
// Output: Conversion occurred.

из: http://msdn.microsoft.com/en-us/library/85w54y0a(v=VS.100).aspx

Doбудьте осторожны с этим, для удобочитаемости часто бывает странно видеть, как один тип магически приводится к другому - люди не всегда сначала думают, что в игре есть операторы преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...