Неявная типизация; почему просто локальные переменные?

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

class Test extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          body: new Container(
            padding: EdgeInsets.all(64.0),
            child: new Column(
              children: <Widget>[
                new ClipPath(
                  clipper: new CustomHalfCircleClipper(),
                  child: new Container(
                    height: 300.0,
                    width: 300.0,
                    decoration: new BoxDecoration(color: Colors.blue, borderRadius: BorderRadius.circular(150.0) ),
                  ),
                )
              ],
            ),
          ),
        );
      }
    }

    class CustomHalfCircleClipper extends CustomClipper<Path> {
      @override
      Path getClip(Size size) {
        final Path path = new Path();
        path.lineTo(0.0, size.height / 2);
        path.lineTo(size.width, size.height / 2);
        path.lineTo(size.width, 0);
        return path;
      }
      @override
      bool shouldReclip(CustomClipper<Path> oldClipper) {
        return true;
      }
    }
22
задан Ed Guiness 5 May 2009 в 12:59
поделиться

6 ответов

Эрик Липперт сделал целую запись в блоге на эту тему.

Таким образом, основная проблема заключается в том, что для этого потребовалось бы основная перестройка компилятора C # для этого. Объявления в настоящее время обрабатываются в один проход. Это потребует нескольких проходов из-за способности формировать циклы между выведенными переменными. VB.net имеет примерно ту же проблему.

42
ответ дан 29 November 2019 в 04:09
поделиться

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

0
ответ дан 29 November 2019 в 04:09
поделиться

Потому что это гораздо проще сделать. Если вы хотите сделать вывод для всех типов, то вам понадобится что-то вроде системы вывода типов Хиндли Милнера, которая сделает ваш любимый C # на производном языке Хаскеля.

1
ответ дан 29 November 2019 в 04:09
поделиться

У Джареда в ответе фантастическая ссылка, к фантастической теме.

Я думаю, что это не дает четкого ответа на вопрос.

Почему бы нет?

var getFoo() {
    return new Foo(); 
}

Причина этого:

Что если?

class Foo {}

var GetFoo() {
   return GetBar(); 
}

var GetBar() {
  return GetBaz(); 
}

var GetBaz() {
   return new Foo();
}

Вы могли бы сделать вывод, что GetFoo собирается вернуть Foo , но вам придется проследить через все вызовы, которые делает метод, и его children делает только для вывода типа. В настоящее время компилятор C # не предназначен для такой работы. Он нуждается в методах и типах полей на ранних стадиях процесса, прежде чем код, который выводит типы, может быть запущен.

На чисто эстетическом уровне я обнаружил, что определения переменных методов путают вещи. Это единственное место, где я думаю, что явное всегда помогает, оно защищает вас от выстрела в себя, случайно возвращая тип, который вызывает изменение вашей подписи и тонны других сигнатур зависимых методов. Хуже всего то, что вы могли бы потенциально изменить все свои сигнатуры цепочки методов, даже не подозревая, что сделали это, если вы вернете значение метода, который возвращает объект и оказался удачным.

Я думаю, что методы var лучше оставить для динамических языков. как Руби

7
ответ дан 29 November 2019 в 04:09
поделиться

По сути, проблема, с которой вы столкнулись, заключается в том, что C # (на данный момент) является языком со статической типизацией. Локальная переменная, определенная как var, по-прежнему статически типизирована, но синтаксически скрыта. С другой стороны, метод, возвращающий var, имеет множество последствий. Он становится скорее интерфейсом для использования, и вы ничего не получите от использования var.

1
ответ дан 29 November 2019 в 04:09
поделиться

вы можете использовать в vs 2010 Dynamic

Dynamic getFoo() { 
    return new Foo();  
} 
1
ответ дан 29 November 2019 в 04:09
поделиться
Другие вопросы по тегам:

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