Что такое «бормотание»? - PullRequest
19 голосов
/ 17 апреля 2011

Я видел несколько упоминаний о «бормотании», таких как ответ StackOverflow: Будет ли будущая версия .NET поддерживать кортежи в C #?

Я гуглил термин, и я не смог найти много объяснений, кроме некоторых людей, надеющихся, что C # в конечном итоге его поддержит.

Что такое бормотание?

Ответы [ 2 ]

21 голосов
/ 17 апреля 2011

Я не знаю, придумал ли кто-то из команды разработчиков C # этот термин, или он используется в других отраслях промышленности. Мы начали использовать его, работая над неявно типизированными локальными переменными (то есть «var x = what;») в C # 3.0. Довольно распространенный сценарий - хотеть, чтобы компилятор выводил часть типа, но явно указывал на другую часть. Например, рассмотрим следующее:

var list = new List<int>() { 10, 20, 30 };

Здесь тип «список» не указан, но задан аргумент типа общего списка. Можно предположить, что это может быть выведено из инициализатора:

var list = new List<???>() { 10, 20, 30 };

Здесь ??? означает «здесь есть аргумент типа; компилятор, выясни, какой он должен быть из контекста».

Мы называем это «бормотанием», потому что один шутливо представляет читаемый код как «var list равен новому списку hrmhmrhrm, инициализированному десятью, двадцатью, тридцатью».

Мы никогда не внедряли бормотание, что немного огорчительно, потому что это означает, что трудно составить список анонимного типа. Для этого вы можете использовать трюк " cast by example ".

1 голос
/ 17 апреля 2011

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

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

List<MyObject> myList = SomeFunctionThatReturnsThisList(someParameter);
var afterTransformation = myList.Select<MyObject, var>(o => new { x = o.x, y = o.y });

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...