变量'x'的类型为'Product',在范围内被引用,但是它没有被定义。

11

我在一个类库项目中有一个名为Product的类。我正在使用SubSonic SimpleRepository来持久化对象。我在Product类中有以下方法:

public static IList<Product> Load(Expression<Func<Product, bool>> expression)
{
    var rep=RepoHelper.GetRepo("ConStr");
    var products = rep.Find(expression);
    return products.ToList();
}

我像这样调用了这个函数:

private void BindData()
{
    var list = Product.Load(x => x.Active);//Active is of type bool
    rptrItems.DataSource = list;
    rptrItems.DataBind();
}

BindData中调用Load会抛出异常:

variable 'x' of type 'Product' referenced from scope '', but it is not defined

我该如何解决这个问题。

编辑:通过逐步查看 SubSonic 代码,我发现错误是由这个函数引起的。

private static Expression Evaluate(Expression e)
{
    if(e.NodeType == ExpressionType.Constant)
        return e;
    Type type = e.Type;
    if(type.IsValueType)
        e = Expression.Convert(e, typeof(object));
    Expression<Func<object>> lambda = Expression.Lambda<Func<object>>(e);
    Func<object> fn = lambda.Compile(); //THIS THROWS EXCEPTION
    return Expression.Constant(fn(), type);
}

1
看起来SubSonic有一个bug。(@Kobi:不是。) - Timwi
1个回答

14

在我苦思冥想并甚至向Jon Skeet寻求帮助多日后,我终于找到了问题所在。

实际上问题出现在SubSonic中(@Timwi是正确的)。它就在这一行代码中:

var list = Product.Load(x => x.Active);//Active is of type bool

我将它更改为:

var list = Product.Load(x => x.Active==true);

一切都好。


5
你知道为什么这是个问题吗? - mat
5
这是错误信息的热门搜索结果,但不幸的是,这并不是大多数人,包括我和@user1039462遇到的问题的答案。对于我来说,问题在于你必须在所有地方使用相同的ParameterExpression。仅仅ParameterExpression具有相同的变量名是不够的。我曾经认为它足够了,但由于我的表达式树和根LambdaExpression中不是同一个ParameterExpression实例,我会收到关于范围的异常。 - user1228
@Will,问题出在SubSonic上。如果没有明确设置,它不会设置变量的值。 - TheVillageIdiot
@TheVillageIdiot:我知道,但错误信息是一样的,而且这个问题是该错误信息的热门搜索结果 :/ - user1228
2
我在此留下评论,因为它是错误消息的最佳搜索结果。如果您正在使用ServiceStack.OrmLite并且在尝试从数据库中Select某些内容时出现此异常,请注意,正确的空值检查应使用NullableVar!= null,而不是NullableVar.HasValue - J0HN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接