tag:blogger.com,1999:blog-8596733192274108952.post6562804751064512999..comments2024-03-12T06:00:18.305+02:00Comments on Programming stuff: О пользовательских преобразованиях типовSergey Teplyakovhttp://www.blogger.com/profile/14300835272589262297noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-8596733192274108952.post-25939385486286539152013-06-15T21:13:07.561+03:002013-06-15T21:13:07.561+03:00Ну проблема с последним кодом не столько с неявным...Ну проблема с последним кодом не столько с неявным преобразованием сколько с неочевидным поведением Nullable, всё-таки мне кажется. Будь .Net спланирован немножко аккуратнее может быть бы было что-то вроде:<br /><br />interface IAdditiveGroup : INullable {<br /> T Add(T b);<br />}<br /><br />interface IMultiplicativeGroup : INullable {<br /> T Mul(T b);<br />}<br /><br />struct AdditiveNullable : IAdditiveGroup><br /> where T : IAdditiveGroup<br />{<br /> // associate default/null with zero<br /> // ...<br /> public T Add(T b)<br /> {<br /> if (!b.HasValue)<br /> return this;<br /> else if (!HasValue)<br /> return b;<br /> else<br /> return new AdditiveNullable(Value.Add(b.Value));<br /> }<br />}<br /><br />struct MultiplicativeNullable : IMultiplicativeGroup><br /> where T : IMultiplicativeGroup<br />{<br /> // associate default/null with zero<br /> // ...<br /> public T Mul(T b)<br /> {<br /> if (!b.HasValue)<br /> return this;<br /> else if (!HasValue)<br /> return b;<br /> else<br /> return new MultiplicativeNullable(Value.Mul(b.Value));<br /> }<br />}<br /><br />struct RingNullable : IAdditiveGroup>, IMultiplicativeGroup><br /> where T : IAdditiveGroup, IMultiplicativeGroup<br />{<br /> // ...<br /> public T Add(T b)<br /> // ...<br /> public T Mul(T b)<br /> // ...<br />}<br /><br /><br />Yep... C# is even more awful language than C++ for such constructions, I think.Anonymoushttps://www.blogger.com/profile/03159331377410025186noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-8709905773472618132013-06-13T04:34:22.661+03:002013-06-13T04:34:22.661+03:00@Viacheslav: а разве не проще, когда не только ком...@Viacheslav: а разве не проще, когда не только компилятору очевидно, какой метод будет исполняться, но и человеку? Наличие неявных преобразований делает сей процесс (выбора метода компилятором) значительно мнее простым и понятным.<br /><br />Ну и вообще, это ж, вроде, распространенный совет (он есть у Саттера, Мейерса, Вагнера), а здесь я привел очередное подтверждение того, насколько легко наступить на грабли.<br /><br />Ну и вообще, есть некоторые языки программирования (тот же F#), в которых все неявные преобразования запрещены, включая преобразования long -> int, string -> object.<br /><br />Я не предлагаю заходить настолько далеко, но и примеров из реальных приложений (а не библиотек, типа Complex), когда неявные преобразования являются мега-удобными, мне тоже как-то в голову не приходят.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-79218797053964600442013-06-13T01:44:46.587+03:002013-06-13T01:44:46.587+03:00На основании того, что кто-то когда-то не правильн...На основании того, что кто-то когда-то не правильно, не подумав, что-то применил делать вывод "в большинстве случаев" по-другому "будет значительно более простым и понятным" - оригинально :о)<br /><br />Этак детей попросту к инструментам, в мастерскую, не допускают, а, допуская, строго контролируют. Но делать вывод из этого о том, что без инструментов "в большинстве случаев" будет лучше - это смело :о)Anonymoushttps://www.blogger.com/profile/11725153141467656623noreply@blogger.com