Здравствуйте, igna, Вы писали:
I>Иногда результатом работы метода являются два значения, причем первое всегда используется вызывающим кодом, второе — только в некоторых случаях. Это второе значение можно сделать невидимым для кода, которому оно не нужно, поместив оба значения-результата в struct и определив операцию неявного преобразования к типу первого значения:
I>I>struct FResult {
I> public int Required { get; private set; }
I> public int Optional { get; private set; }
I> public FResult(int required, int optional)
I> : this() { Required = required; Optional = optional; }
I> public static implicit operator int(FResult result) {
I> return result.Required;
I> }
I>}
I>FResult F() {
I> . . .
I> return new FResult( . . .
I>}
I>void G() {
I> int i = F();
I> . . .
I>}
I>void H() {
I> FResult r = F();
I> int i = r.Required;
I> int j = r.Optional;
I> . . .
I>}
I>
I>Возражения принимаются.
1) Преобразование типов используется не по назначению.
Нет механизма преобразования int к FResult.
Преобразование FResult к int не будет поддерживать транзитивность, тобишь FResult >> int >> NewFResult и имеем FResult <> NewFResult в случаи,
если нужно использовать свойство — Optional.
2) Логика по принятию решения, нужно использовать Optional или не нужно должна быть реализована за пределами класса F и результатов которые он возвращает.
Не стоит "косвенно" и "неявно" засунуть эту логику в FResult, это не его обязанности.
Вернёт метод 2 значения и что в этом такого, тот кто получил эти значения должен знать как с ними работать.
3) Сдаётся, что пахнет полиморфизмом.
Трудно что то конкретное подсказать, нужна более детальная инфа о пред. области.
Вопросы аля в одном слчаи должен в другом нет >> явный намёк на полифорфизм.