在C#中使用默认通用值

Som*_*ser 3 c# ado.net dapper

我有一些用C#编写的代码.我正在尝试编写一些我可以重用的通用代码.我的实际代码更复杂.但是,代码问题如下所示:

public async Task<T> ExecuteQueryAsync<T>(string sql)
{
  var results = default(T);
  using (var database = new SqlConnection("[ConnectionString]"))
  {
    database.Open();
    results = await database.QueryAsync<T>(sql);                        
  }
  return results;
}
Run Code Online (Sandbox Code Playgroud)

当我构建我的项目时,我得到一个编译时错误,说:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<T>' to 'T'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

我不完全理解为什么我会收到这个错误.我打算用这样的方式调用它:

Adapter adapter = new Adapter();
var results = await adapter.ExecuteQueryAsync<IEnumerable<Customer>>("SELECT * FROM Customer");
Run Code Online (Sandbox Code Playgroud)

在上面,不会T是一个IEnumerable<T>?如果是这种情况,我不明白为什么我在编译时遇到这种类型转换错误.

谢谢!

Dan*_*ite 5

尝试这样的事情.

public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql)
{
  IEnumerable<T> results = Enumerable.Empty<T>();
  using (var database = new SqlConnection("[ConnectionString]"))
  {
    database.Open();
    results = await database.QueryAsync<T>(sql);                        
  }
  return results;
}
Run Code Online (Sandbox Code Playgroud)

  • @Grundy但事实并非如此.即使你使用`null`,你也永远不会真正返回`null`.同样,这是一个你可以证明永远不会被退回的价值; 什么是无关紧要的.哎呀,如果你愿意,你可以*保持未经初始化*和*不给它任何东西*. (2认同)