键入从lambda到委托的Cast错误

时间:2014-01-30 13:11:49

标签: c# lambda delegates

我一直关注这个Example来实现 LazyLoading ,用一些值初始化lazyObject我正在 Lambda Expression的帮助下调用函数。但是,我收到转换错误,并且说它不是代理。以下是代码:

private Lazy<t_user_audit> lazyList = null;
lazyList = new Lazy<t_user_audit>(() => new t_user_audit { client.GetAudit(10) });

我在谷歌上搜索了这个错误,但它似乎没有帮助,而且我在生命中第一次看到这个错误,所以可能是我需要使用正确的语法编码帮助。那么现在任何人都可以帮助我。

public t_user_audit GetAudit(int id)
{
    return _work.GetGenericRepositoryFor<t_user_audit>().SingleOrDefault(p => p.CustomerId == id);
}

现在,你可以看到我在分层架构中工作,所以我将无法发布整个代码以及我正在使用的另一件事Entity Framework.

之后,使用上面这行,我得到两个错误:

错误17无法将lambda表达式转换为'bool'类型,因为它不是委托类型

第二个是:

错误18无法使用集合初始值设定项初始化类型'BBTI.Entities.t_user_audit',因为它未实现'System.Collections.IEnumerable'

1 个答案:

答案 0 :(得分:2)

已编辑问题的新答案

问题是你的lambda表达式无效 - 你试图使用集合初始化器语法,但你的类型不是集合。所以不要这样:

() => new t_user_audit { client.GetAudit(10) }

你想:

() => new List<t_user_audit> { client.GetAudit(10) }

原始回答

来自评论:

  

“它将返回一个具有单个记录的对象”

如果您的意思是声明GetAudit返回t_User,请执行以下操作:

public t_User GetAudit(int something)

那就是问题所在。要创建Lazy<List<Foo>>,您需要一个代理人,该代理人将返回List<Foo>,而不是Foo。所以这应该有效:

lazyList = new Lazy<List<t_User>>(() => new List<t_User> { client.GetAudit(10) });

或者你可以改为Lazy<t_User>,如果你只打算一次性使用。

另一种可能性(很难说,因为你没有在问题中提供足够的信息)是GetAudit返回类似IEnumerable<t_User>而不是List<t_User>的内容。在这种情况下,您只需要根据返回值创建一个列表:

lazyList = new Lazy<List<t_User>>(() => client.GetAudit(10).ToList());

(我也强烈鼓励您开始遵循.NET命名约定,并抛弃t_前缀。)