То, что вы хотите сделать, невозможно.
Чтобы понять это, вы должны понимать, что существует два различных типа приведения.
Для типов значений (например, double
)Вы применяете действительное значение.Теперь это другая вещь с другой идентичностью.Из-за этого определенные пользователем операторы приведения типа значения, которые сохраняют идентичность , не разрешены компилятором.
Для ссылочных типов (например, Parameter
) вы приводите ссылку, а нефактическое значение, так что технически возможно сохранить идентичность (поскольку сам объект не изменился).Однако это допускается только через приведение, предоставляемое системой типов.Определяемые пользователем преобразования не сохраняют идентичность и всегда возвращают новый объект.
Что приводит нас к вашему утверждению:
foo = aNumber;
Вы пытаетесь присвоить тип значения к ссылочному типу .
Как вы косвенно поняли, «экземпляра» не существует, поскольку вы конвертируете из типа значения в ссылочный тип.Ваш оператор будет выглядеть примерно так:
static public implicit operator Parameter(double p)
{
return new Parameter() { BaseValue = p };
}
Как видите, очевидно, что необходимо создать новый экземпляр, если вы хотите выполнить преобразование между этими типами.
Наконец, поскольку вы хотите сохранить все остальные свойства, вы, по сути, описываете setter , который у вас уже есть:
foo.BaseValue = aNumber;
Просто введите .BaseValue
.Вы будете в порядке.