Реактивный: ошибка синтаксиса компиляции Lambda [дубликат]

Существует множество решений, таких как font-size:0, word-spacing, margin-left, letter-spacing и т. д.

Обычно я предпочитаю использовать letter-spacing, потому что

  1. кажется, что если мы присваиваем значение, большее ширины дополнительного пространства (например, -1em).
  2. Однако с word-spacing и margin-left это будет нехорошо, когда мы устанавливаем большее значение, например -1em.
  3. Использование font-size неудобно, когда мы пытаемся использовать em как font-size.

So , letter-spacing кажется лучшим выбором.

Однако, я должен предупредить вас

, когда вы используете letter-spacing, вам лучше использовать -0.3em или -0.31em not другие.

* {
  margin: 0;
  padding: 0;
}
a {
  text-decoration: none;
  color: inherit;
  cursor: auto;
}
.nav {
  width: 260px;
  height: 100px;
  background-color: pink;
  color: white;
  font-size: 20px;
  letter-spacing: -1em;
}
.nav__text {
  width: 90px;
  height: 40px;
  box-sizing: border-box;
  border: 1px solid black;
  line-height: 40px;
  background-color: yellowgreen;
  text-align: center;
  display: inline-block;
  letter-spacing: normal;
}

Если вы используете Chrome (тестовая версия 66.0.3359.139) или Opera (тестовая версия 53.0.2907.99) , вы можете увидеть:

Если вы используете Firefox (60.0.2), IE10 или Edge, то, что вы видите, может быть:

Это интересно. Итак, я проверил mdn-letter-spacing и нашел это:

length

Задает дополнительное межсимвольное пространство в дополнение к умолчанию пространство между символами. Значения могут быть отрицательными, но могут быть ограничения, связанные с реализацией. Пользовательские агенты не могут больше увеличивать или уменьшать межсимвольное пространство, чтобы оправдать текст.

blockquote>

Похоже, что это и есть причина.

33
задан Daniel Daranas 25 June 2013 в 11:42
поделиться

6 ответов

Причина, по которой вышеприведенный оператор не работает, был предоставлен другими пользователями и фактически не ответил на мой истинный вопрос.

После игры еще немного, я понял, что вы можете использовать этот оператор для выполните вышеуказанный оператор, но это приведет к некорректному коду.

Если бы я должен был изменить указанный выше оператор:

int a = 5;
int b = 10;
int result = a == b ? doThis() : doThat(); 

private int doThis()
{
    MessageBox.Show("Did this");
    return 0;
}
private int doThat()
{
    MessageBox.Show("Did that");
    return 1;
}

Этот код скомпилирует и выполнит так, как он должен , Однако, если эти методы изначально не предназначались для возврата чего-либо и ссылались на другие области кода, теперь вы должны обрабатывать возвращаемый объект каждый раз, чтобы вызвать эти методы.

В противном случае вы можете использовать trernary operator для однострочного метода выбора и даже знать, какой метод он вызвал в следующей строке, используя результат.

int result = a == b ? doThis() : doThat();

if (result == 0)
   MessageBox.Show("You called doThis()!");

Теперь этот код абсолютно бессмыслен и может быть легко выполнен с помощью If If Else , но я просто хотел знать, можно ли это сделать, и что вам нужно сделать, чтобы заставить его работать.

Теперь, когда я знаю, что вы можете эффективно возвращать любой тип в этих методах, это может стать немного более полезно. Это может считаться «плохой кодирующей практикой», но может стать очень полезным в ситуациях, в которых он никогда не был МОЛОДЕЖИ.

Вы могли бы получить доступ к одному объекту или другому на основе любого условия, и это может быть очень полезно в одна строка кода.

UserPrivileges result = user.Group == Group.Admin ? GiveAdminPrivileges() : GiveUserPrivileges();

private UserPrivileges GiveAdminPrivileges()
{
      //Enter code here
      return var;
}
private UserPrivileges GiveUserPrivileges()
{
      //Enter code here
      return var;
}

Конечно, это можно сделать с помощью инструкции If, но я думаю, что использование Тернарного оператора для других целей делает программирование забавным. Теперь это может быть не так эффективно, как оператор If Else, и в этом случае я бы никогда не использовал это.

2
ответ дан Kyle Uithoven 26 August 2018 в 02:16
поделиться

.NET не (легко) поддерживает (читаемую версию) это по какой-то причине. Это очень жуткий и делает ваш код трудным для чтения. Логические деревья должны быть относительно легко перемещаться. Если бы я должен был зайти на работу и весь код, который они использовали тройной для назначения значений, методов вызова и т. Д. Я думаю, что я просто уйду.

1
ответ дан FreeAsInBeer 26 August 2018 в 02:16
поделиться

Тернарный оператор должен что-то вернуть. Типичное использование выглядит так:

int x = (a > b) ? a : b;

Если вы попробуете что-то вроде

a + b;

, компилятор будет жаловаться.

(a > b) ? a - b : b - a;

в основном ярлык для «a-b» или «b-a», которые сами по себе не являются законными.

15
ответ дан iluxa 26 August 2018 в 02:16
поделиться

тернарный оператор используется для возврата значений, и эти значения должны быть назначены. Предполагая, что методы doThis() и doThat() возвращают значения, простое задание исправит вашу проблему.

Если вы хотите делать то, что вы пытаетесь, это возможно, но решение не очень .

int a = 5;
int b = 10;
(a == b ? (Action)doThis : doThat)();

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

32
ответ дан NerdFury 26 August 2018 в 02:16
поделиться

Вы должны иметь возможность сделать это, хотя:

        int a = 5;
        int b = 10;

        var func = a == b ? (Action)doThis : (Action)doThat; // decide which method

        func(); // call it

Не то, что это действительно полезно

2
ответ дан skarmats 26 August 2018 в 02:16
поделиться

Условный оператор является выражением, которое возвращает значение. Вы не можете использовать его с функциями, возвращающими void.

Вместо этого вы должны использовать обычный if.

7
ответ дан SLaks 26 August 2018 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: