Что нужно сделать, чтобы создать ошибку компиляции C #, когда вы используете пользовательские методы, где ожидается выражение? - PullRequest
3 голосов
/ 26 сентября 2011

Что потребуется для создания ошибки компиляции C # , когда вы используете пользовательские методы, где ожидается выражение?

Верно, что лямбда-выражения, содержащие вызовы пользовательских методов, такжетехнически, ну, выражения.Но поскольку пользователь выражений, таких как LINQ to SQL, LINQ to JSON и т. Д., Не ожидает этого, он выдает ошибки времени выполнения.

Что можно сделать, чтобы компилятор знал, чего ожидает такая структура, как LINQ to SQL и т. Д.,и что не разрешено.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Ничего не поделаешь по следующим причинам:

  1. Лямбда-выражение (!), Которое содержит вызов метода, все еще является выражением
  2. Не все вызовы методов являются недопустимыми. Некоторые методы понятны и правильно переведены. Таким образом, даже если вы найдете способ разрешить только лямбда-выражения, которые не вызывают методы, вы бы запретили все вызовы методов, даже допустимые.
1 голос
/ 26 сентября 2011

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

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

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

Я бы не рассчитывал, что это будет доступно в ближайшем будущем. Может быть, весь «компилятор как сервис» (он же Рослин) мог включить этот сценарий?

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