Вопрос

Помимо сомнительной полезности этого, я хотел бы спросить, возможно ли что-то сделать в этом направлении.

class MyPrimitive {
        String value;
        public String Value {
            get { return value; }
            set { this.value = value; }
        }
}

// Instead of doing this...
MyPrimitive a = new MyPrimitive();
a.Value = "test";
String b = a.Value;

// Isn't there a way to do something like this?
MyPrimitive a = "test";
String b = a;

Мне нравится заключать примитивные типы в пользовательские классы, используя свойство, чтобы методы get и set выполняли другие функции, например проверку.
Поскольку я делаю это довольно часто, я подумал, что было бы неплохо иметь более простой синтаксис, как для стандартных примитивов.
Тем не менее, я подозреваю, что это не только невозможно, но и может быть концептуально неправильным. Любые идеи будут приветствоваться, спасибо.

Это было полезно?

Решение

Используйте тип значения ( struct ) и передайте ему оператор неявного преобразования из нужного вам типа справа от присваивания.

struct MyPrimitive
{
    private readonly string value;

    public MyPrimitive(string value)
    {
        this.value = value;
    }

    public string Value { get { return value; } }

    public static implicit operator MyPrimitive(string s)
    {
        return new MyPrimitive(s);
    } 

    public static implicit operator string(MyPrimitive p)
    {
        return p.Value;
    }
}

РЕДАКТИРОВАТЬ: сделал структуру неизменной, потому что Марк Гравелл абсолютно прав.

Другие советы

Вы можете использовать неявное приведение . Это не рекомендуется, но:

public static implicit operator string(MyString a) {
    return a.Value;
}
public static implicit operator MyString(string a) {
    return new MyString { value = a; }
}

Опять плохая практика.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top