Цепочка оператора '=' в C # - неужели этот тест должен пройти?

Я как раз писал установщик свойств и получил мозговую волну о том, почему нам не нужно возвращать результат набора , когда свойство может быть задействовано в цепочке операторов = , например:

var a = (b.c = d);

(я добавил скобки для ясности, но на практике это не имеет значения)

Я начал думать - а где же компилятор C # получить значение, присвоенное a в приведенном выше примере?

Логика говорит, что это должно быть результатом операции (bc = d) , но поскольку это реализовано с помощью метода void set_blah (value) , этого не может быть.

Итак, единственные другие варианты:

  • Перечитать bc после назначения и использовать это значение
  • Повторно использовать d

  • Изменить (после ответа и комментарии Эрика) - есть третий вариант, который делает C #: использовать значение, записанное в bc после того, как произошли какие-либо преобразования

Теперь, на мой взгляд, правильное прочтение приведенного выше строка кода

устанавливает a в результат установки bc на d

Я думаю, что это разумное прочтение кода - поэтому я подумал, что « d проверьте, действительно ли это происходит с помощью слегка надуманного теста, но спросите себя, должен ли он пройти или не пройти:

public class TestClass
{
  private bool _invertedBoolean;
  public bool InvertedBoolean
  {
    get
    {
      return _invertedBoolean;
    }
    set
    {
      //don't ask me why you would with a boolean,
      //but consider rounding on currency values, or
      //properties which clone their input value instead
      //of taking the reference.
      _invertedBoolean = !value;
    }
  }
}

[TestMethod]
public void ExampleTest()
{
  var t = new TestClass();
  bool result;
  result = (t.InvertedBoolean = true);
  Assert.IsFalse(result);
}

Этот тест не прошел .

Более пристальное изучение генерируемого IL для шоу кода s что значение true загружается в стек, клонируется с помощью команды dup , а затем оба извлекаются в двух последовательных присвоениях.

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

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

Возможно, я очень толстый, но мне это говорит о неправильной реализации этого шаблона компилятором (.Net 4, кстати). Но тогда мое ожидание / чтение кода неверно?

18
задан Andras Zoltan 12 July 2011 в 16:01
поделиться