【问题标题】:Implicitly typed local variables must be initialized必须初始化隐式类型的局部变量
【发布时间】:2015-08-19 13:01:59
【问题描述】:

这是代码:- 如何初始化data

var data;

if (mode == "view")
                {
                    data = (from a in ctx.tblEmployee
                            where a.CompanyId == companyId
                            join b in ctx.tblTO_ShiftSchedule on a.Id equals b.EmployeeId
                            where b.CompanyId == companyId                            
                            select new { a, b, c, d }).ToList();
                }
                else
                {
                    data = (from a in ctx.tblEmployee
                            where a.CompanyId == companyId                            
                            select new { a, b, c, d }).ToList();
                }

【问题讨论】:

  • 你不能那样做。 var 必须在创建时进行初始化。含义var data = yourlinqexpression; 两个匿名类型看起来相同(具有a、b、c、d)这一事实并不能使它们相同。您不能使用一个变量来同时保存两者。如果你想这样做,请声明一个类型化的类。
  • 如果必须这样定义,请使用:msdn.microsoft.com/en-us/library/ty67wk28.aspx
  • var 关键字只是告诉编译器从赋值表达式的右侧推断变量的类型。在您的代码中,语句 var data; 没有为 data 分配任何内容,因此编译器无法推断类型并且您会收到编译时错误。
  • @dman: Your statemant "两个匿名类型看起来相同(具有 a、b、c、d)这一事实并不能使它们相同。你不能使用一个变量两个都持有。” 是假的。使用条件运算符让编译器将两个 linq 表达式解析为一种兼容的匿名类型 new { a, b, c, d} 非常好。
  • @InBetween - 我的立场是正确的。你是绝对正确的。

标签: c# asp.net-mvc linq


【解决方案1】:

你不能初始化匿名类型,所以:

var data = mode == "view" 
? (from a in ctx.tblEmployee
                        where a.CompanyId == companyId
                        join b in ctx.tblTO_ShiftSchedule on a.Id equals b.EmployeeId
                        where b.CompanyId == companyId                            
                        select new { a, b, c, d }).ToList()
: (from a in ctx.tblEmployee
                        where a.CompanyId == companyId                            
                        select new { a, b, c, d }).ToList();

【讨论】:

  • 可以初始化一个匿名类型变量,但它并不漂亮。
  • 这个不编译,多了一个分号。
  • 我删除了...这是不经意的修复
【解决方案2】:

您的查询中的变量 c 和 d(以及第二部分中的 b)未定义,所以我有点猜测您想要实现的目标。因此我的代码不完整。

你需要一个辅助方法:

IEnumerable<T> GetDefaultEnumerable<T>(T instance)
{
    return Enumerable.Empty<T>();
}

然后用匿名类型的虚拟对象初始化数据

var data = GetDefaultEnumerable(new { a = new tblEmployee(), b = new tblTO_ShiftSchedule(), c = ..., d = ... });

但是,在大多数情况下,使用普通类型应该会更清楚。如果可能,您还可以考虑将条件重构到查询中。

【讨论】:

    【解决方案3】:

    你不能初始化一个匿名类型 如果您知道从 linq 查询中获得的结构,我建议您创建一个命名结构 例如

    class Data
    {
        Public Property A {get; set;}
        Public Property B {get; set;}
        Public Property C {get; set;}
        Public Property D {get; set;}
    }
    

    并修改您现有的代码,使其看起来像这样

    var data = List<Data>;
    
    if (mode == "view")
    {
        data = (from a in ctx.tblEmployee
               where a.CompanyId == companyId
               join b in ctx.tblTO_ShiftSchedule on a.Id equals b.EmployeeId
               where b.CompanyId == companyId                            
               select new Data with { A=a, B=b, C=c, D=d }).ToList();
    }
    else
    {
        data = (from a in ctx.tblEmployee
                where a.CompanyId == companyId                            
                select new Data with { A=a, B=b, C=c, D=d }).ToList();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多