2015-01-27 5 views
9

Использование новых членов Expression работоспособных фигурировать в C# 6.0, мы можем взять метод как это:Почему мы не можем использовать конструкторы с выраженным выражением?

public void Open() 
{ 
    Console.WriteLine("Opened"); 
} 

... и изменить его к простому выражению с эквивалентной функциональностью:

public void Open() => Console.WriteLine("Opened"); 

Однако это не относится к конструкторам. Код, такие как это не компилируется:

private DbManager() => Console.WriteLine("ctor"); 

Нор делает это:

private DbManager() => {} 

Есть ли причина, почему конструкторы не могут извлечь выгоду из особенности экспрессии работоспособных членов, и должен быть объявлен традиционным способом ?

+0

Я могу только представить * догадка * здесь ... в основном они значительно, менее полезны для конструкторов, а главное Прецедент для выражения работоспособных членов, где они * return * something, тогда как в конструкторе вы ничего не возвращаете. Обратите внимание, что ваш последний пример более длинный, чем просто запись кода * без * '=>'. –

+0

Были эксперименты вокруг конструкторов, которые были оставлены для C# 6.0. Есть еще несколько функций, планируемых для C# 7.0 с участием конструкторов, и на этот раз было принято решение ничего не менять на конструкторы. –

ответ

14

Это было бы более запутанным, чем полезным. Особенно, когда вы добавляете вызов другому конструктору.

Вот прямая цитата из дизайна заметок:

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

От C# Design Notes for Nov 4, 2013

В более общем виде:

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

3

Теперь, когда выпущен C# 7.0, можно использовать конструкторы с выраженной структурой.

private DbManager() => Console.WriteLine("ctor"); 

отлично работает в C# 7.0

+1

Спасибо за обмен! Было бы неплохо узнать, что команда C# обошла проблемы, упомянутые в принятом ответе. – Gigi

+0

@ Гиги Они никогда не были техническими проблемами. Аргументом было то, что они «выглядели бы странно перед жирной стрелкой». – Neme

Смежные вопросы