Re: Багофича C# - object initializer
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.07.24 02:35
Оценка: 2 (1) +3 -1
Здравствуйте, Baiker, Вы писали:

B>Ребят, столкнулся с какой-то маразматической особенностью C# (на которую у MS конечно же есть объяснения), но моeй инженерной логике она не поддаётся.

B>// где-то в коде решили создать класс B:

B>var b = new B { P2 = P1 + P };// ошибка прокладки между стулом и монитором!


B>...и..... ннна тебе поддых канпелятором!! В object initializer ни мембера P, ни P1 канпелятор НЕ ВИДИТ!

Всё верно. Initializer исполняется в том же скоупе, где и new statement.
B>Что это за маразм?? Что за такой странный контекст вдруг образовался в элементарном инициализаторе?
Он как раз не образовался. С чего вы ожидали, что он там будет образовываться?
B>Я-то (наивный) думал, что {} — это просто сокращение для b.P2 = b.P1 + b.P ! Похоже, мелкомягкие что-то там намудрили под капотом.
Да, совершенно верно — баг в вашей логике. {} — это просто сокращение для b.P2 = P1 + P . Откуда вы там взяли справа префиксы b. — никакой логике не поддаётся.

B>Примером выше я хотел иллюстрировать несколько другой маразм:


B>
B>Форма из WinForms
B>   Метод()
B>   {
B>      var c = new UserControl {
B>          Left = Width / 2
B>      };
B>   }
B>


B>Здесь в OI свойство Left КАК И ПОЛОЖЕНО — от UserControl, но Width оказывается берётся от самой формы(!!!). С какого перепоя??

Эмм. А когда вы пишете руками c.Left = Width / 2, вас не удивляет то, что Width берётся из контекста, а не из c?
B>Ведь Width должно браться из самого внутреннего контекста, т.е. от UserControl! Что за бредовая логика заставляет MS лезть в объемлющий контекст?
Нет конечно, с чего вы взяли, что Width должно браться откуда-то ещё, кроме объемлющего контекста?

B>PS

B>А я ведь ещё на заре этой дебильной фичи предлагал: не надо этой узколобой привязки инициализатора к конструктору!!
B>Здесь j во-первых может инициализироваться в ЛЮБОМ месте кода, а во-вторых, чётко видно кто и откуда берётся: ".p1" — это внутренний мембер (потому что с точки),
B> "p2" — мембер из объемлющего контекста. Просто и универсально как лом. Что помешало неумытым "синьорам" с индийских пальм сделать это по-человечески?
Наверное, то, что предлагаемый вами подход создаёт больше проблем, чем решает. В частности, не очень понятно, как быть с вложенными инициализаторами.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.