Co powoduje, że „metody rozszerzenia nie mogą być dynamicznie wysyłane” tutaj?

Błąd kompilacji

„System.Data.SqlClient.SqlConnection” nie ma odpowiedniej metody o nazwie „Query”, ale wydaje się, że ma metodę rozszerzenia o tej nazwie. Metody rozszerzenia nie mogą być dynamicznie wysyłane. Rozważ rzutowanie dynamicznych argumentów lub wywołanie metody rozszerzenia bez składni metody rozszerzenia.

Teraz wiem, jak obejść ten problem, ale staram się lepiej zrozumieć sam błąd. Mam klasę, którą buduję, aby wykorzystać Dappera. W końcu zamierzam udostępnić nieco bardziej niestandardowe funkcje, aby nasz rodzaj dostępu do danych był znacznie bardziej uproszczony. W szczególności budowanie śledzenia i rzeczy. Jednak teraz jest to tak proste, jak to:

public class Connection : IDisposable
{
    private SqlConnection _connection;

    public Connection()
    {
        var connectionString = Convert.ToString(ConfigurationManager.ConnectionStrings["ConnectionString"]);
        _connection = new SqlConnection(connectionString);
        _connection.Open();
    }

    public void Dispose()
    {
        _connection.Close();
        _connection.Dispose();
    }

    public IEnumerable<dynamic> Query(string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)
    {
        // this one works fine, without compile error, so I understand how to
        // workaround the error
        return Dapper.SqlMapper.Query(_connection, sql, param, transaction, buffered, commandTimeout, commandType);
    }

    public IEnumerable<T> Query<T>(string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)
    {
        // this one is failing with the error
        return (IEnumerable<T>)_connection.Query(sql, param, transaction, buffered, commandTimeout, commandType);
    }
}

ale co ciekawe, gdybym po prostu wydał takie oświadczenie:

_connection.Query("SELECT * FROM SomeTable");

kompiluje się dobrze.

Czy ktoś może mi pomóc zrozumieć, dlaczego wykorzystywanie tego samego przeciążenia w tych innych metodach nie przynosi tego błędu?

questionAnswers(2)

yourAnswerToTheQuestion