隐式类型局部变量必须初始化

sha*_*jar 1 linq linq-expressions

我正在进行列排序,但出现编译时错误:

public static class Helper
{
    public static IQueryable<T> FilterForColumn<T>(this IQueryable<T> queryable, string colName, string searchText)
    {
        if (colName != null && searchText != null)
    {
        var parameter = Expression.Parameter(typeof(T), "m");
        var propertyExpression = Expression.Property(parameter, colName);
        System.Linq.Expressions.ConstantExpression searchExpression = null;
        System.Reflection.MethodInfo containsMethod = null;
        switch (colName)
        {
            case "Title":
            case "Publisher":
            case "ToUser":
            case "CategoryName":
            case "StatusName":
            case "GroupName":
            case "FileSize":
                searchExpression = Expression.Constant(searchText);
                containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
                break;
            case "PublishDate":
                searchExpression = Expression.Constant(DateTime.ParseExact(searchText,"dd/MM/yyyy",null));
                containsMethod = typeof(string).GetMethod("Equals", new[] { typeof(DateTime) });
                break;
        }
        var body = Expression.Call(propertyExpression, containsMethod, searchExpression);
        var predicate = Expression.Lambda<Func<T, bool>>(body, new[] { parameter });
        return queryable.Where(predicate);
    }
        else
        {
            return queryable;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该错误意味着什么。我只是想知道刚刚说了什么错误。请帮我看看发生了什么事...

- - - - - - - - - - - - - - - - - 更新 - - - - - - - - ------------------------

将 PublishDate 大小写更改为:

case "PublishDate":
                    searchExpression = Expression.Constant(DateTime.ParseExact(searchText,"dd/MM/yyyy",null));
                    containsMethod = typeof(string).GetMethod("Equals", new[] { typeof(DateTime) });
                    break;
Run Code Online (Sandbox Code Playgroud)

我面临这样的错误:

Server Error in '/EasyWeb' Application.
Method 'Boolean Equals(System.Object)' is not defined for type 'System.Nullable`1[System.DateTime]'
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: Method 'Boolean Equals(System.Object)' is not defined for type 'System.Nullable`1[System.DateTime]'

Source Error:


Line 39:                     break;
Line 40:             }
Line 41:             var body = Expression.Call(propertyExpression, containsMethod, searchExpression);
Line 42:             var predicate = Expression.Lambda<Func<T, bool>>(body, new[] { parameter });
Line 43:             return queryable.Where(predicate);


Source File: f:\EasyWeb\App_Code\Helper.cs    Line: 41

Stack Trace:


[ArgumentException: Method 'Boolean Equals(System.Object)' is not defined for type 'System.Nullable`1[System.DateTime]']
   System.Linq.Expressions.Expression.ValidateCallInstanceType(Type instanceType, MethodInfo method) +763804
   System.Linq.Expressions.Expression.ValidateCallArgs(Expression instance, MethodInfo method, ReadOnlyCollection`1& arguments) +71
   System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments) +46
   System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, Expression[] arguments) +31
   Helper.FilterForColumn(IQueryable`1 queryable, String colName, String searchText) in f:\EasyWeb\App_Code\Helper.cs:41
   Admin_Post_History.FillGrid(String CommandName, String ColumnName, String SearchText) in f:\EasyWeb\Admin\Post_History.aspx.cs:63
   Admin_Post_History.btnsearch_Click(Object sender, EventArgs e) in f:\EasyWeb\Admin\Post_History.aspx.cs:2414
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 5

var containsMethod = <XYZ>;
Run Code Online (Sandbox Code Playgroud)

告诉编译器 - “嘿,你,分析表达式<XYZ>,无论你推断出什么类型,都使其成为我的变量的类型containsMethod”。

但就你而言,你没有给它任何表达来分析。所以你不能使用隐式类型变量(var),你必须告诉它类型containsMethod是什么。

所以:

MethodInfo containsMethod;
Run Code Online (Sandbox Code Playgroud)

或许。