在没有初始化的情况下定义匿名变量并在switch语句中使用它

时间:2013-12-25 12:32:22

标签: c# .net types

是否可以定义匿名变量并在switch语句中使用它?

这样的事情:

我需要定义一个IEnumerable类型来实际循环DbContext中的实体类型。

DAL.DataClasses1DataContext _db = new DAL.DataClasses1DataContext();
var dbItems;

switch (tableName)
{
     case "QuarryCats" : 
         dbItems = _db.QuarryCats.ToList();
         break;
}

foreach (var item in dbItems)
{
    var orderitem = orderItems.Single(rs => rs.itemId == item.Id);
    item.OrderId = orderitem.orderId;
}

_db.SubmitChanges();

目前我收到编译时错误:

  

Implicity-Type局部变量必须初始化

更新: 来自swich的所有返回类型都有Id和OrderId字段。我需要演员吗?

5 个答案:

答案 0 :(得分:0)

如果您不确定变量的类型,则可以将其定义为dynamic。但你不能使用Intellisense,这是一个缺点。

dynamic myAnonymous;

之后,您可以分配您想要的myAnonymous.It将在运行时初始化的任何内容。

答案 1 :(得分:0)

嗯,“var”要求变量类型应该在编译时定义,例如

  var myVar = 1 + 5 / 7.8; // <- Compiler can elaborate that myVar is double

在你的情况下,myAnonymous的类型取决于 tableName值 - 这种情况将是 已执行, - 所以myAnonymous的类型是运行时,这是禁止的。

  var myAnonymous; // <- Unknown type, can't be elaborated!

  switch (tableName) {
    case "QuarryCats" : 
      myAnonymous = 123; // <- Here it's int

      break;
    case "SomeOther":
      myAnonymous = "ABC"; // <- Here it's String 

但是,您可以使用运行时类型定义:

  dynamic myAnonymous;

  switch (tableName) {
    case "QuarryCats" : 
      myAnonymous = ...

答案 2 :(得分:0)

IEnumerable myAnonymous = new object[]{};

循环:

foreach(var item in myAnonymous) {
     var cat = item as QuarryCat;
     if(cat != null) {
         cat.property = "something new";
     }
}

或者,如果您的类型具有公共字段的界面:

IEnumerable<IAnimal> myAnonymous = new IAnimal[]{};

循环:

foreach(var animal in myAnonymous) {
    animal.eyeColor = "blue";
}

答案 3 :(得分:0)

试试这个:

IEnumerable<object> myAnonymous = new List<object>();

switch (tableName)
{
   case   "QuarryCats" : myAnonymous= _db.QuarryCats.ToList();
   break;
}

foreach (var item in myAnonymous)
{
}
如果您知道IEnumerable<object>返回的类型,请使用<{1>}而不是_db.QuarryCats.ToList()。因此,如果_db.QuarryCats.ToList()返回QuarryCats,请使用IEnumerable<QuarryCats>

答案 4 :(得分:0)

虽然如其他提到的那样,使用dynamic可以解决这个问题,但我更愿意考虑更强类型的解决方案。这里重要的是你的交换机分配一个集合,以便稍后枚举。因为这很常见,我会将其用作类型:

IList myAnonymous = null;
switch (tableName)
{
   case   "QuarryCats" : myAnonymous = _db.QuarryCats.ToList();
   break;
}
foreach (var item in myAnonymous )
{
   // ..           
}

另一件事是,如果集合中的对象实现了一些通用接口会更容易,因此myAnonymous可以是像IList<ISomeCommonInterface>这样的通用集合。

换句话说,在我看来,在这里使用var会带来太多麻烦。