using
дает вам границу вокруг IDisposable
объектов. Как только вы покинете эту границу, объект будет уничтожен.
Например, возьмите эту строку
using (var connection = new SqlConnection(connectionString))
SqlConnection
реализует IDisposable
, поэтому, как только конец блока using
достигается, вызывается метод удаления.
Теперь давайте посмотрим на ваш пример с лямбда -
using (var conn = (() => new SqlConnection(ConnectionString)))
В этом случае ваша переменная conn
не является соединением, вместо этого это анонимный метод, который, конечно, не реализует IDisposable
. Тип анонимного метода зависит от выражения инициализатора, а у вас его нет. Подробнее об этом чуть позже.
Для вашего второго примера,
using (var conn = (() => new SqlConnection(ConnectionString))())
Здесь я начинаю путаться в том, что вы пытаетесь выполнить sh. Я не могу сказать, как вы хотите, чтобы это было отличным от
using (var conn = new SqlConnection(ConnectionString))
Если вы абсолютно обязаны это сделать, вам, вероятно, придется обернуть его в Func
using (var conn = new Func<SqlConnection>(() => new SqlConnection(ConnectionString)).Invoke())
Но, опять же, я не уверен, зачем вам это нужно.