【问题标题】:LINQ2SQL: How do I declare a member variable of type var?LINQ2SQL:如何声明 var 类型的成员变量?
【发布时间】:2010-10-24 22:03:53
【问题描述】:

我有这样的课

    public class foo
    {

        private void getThread()
        {
         var AllThreads = from sc in db.ScreenCycles
                          join s in db.Screens on sc.ScreenID equals s.ScreenID
                          select s;
        }
    }

我想让 AllThreads 变量成为类变量而不是方法变量。像这样……

public class foo
{
    var AllThreads;
    private void getThread()
    {
       AllThreads = from sc in db.ScreenCycles
                          join s in db.Screens on sc.ScreenID equals s.ScreenID
                          select s;
    }
}

它不允许我声明一个 var 类型的类变量。

我该如何做到这一点?

【问题讨论】:

  • 没有“type var”这样的东西,因为 var 实际上不是一个类型——它是一个告诉编译器的关键字,“你想办法把什么类型放在这里,因为我有更好的要做的事情。”

标签: c# .net linq-to-sql var


【解决方案1】:

你可以这样做:

public class foo {    
  IEnumerable<string> AllThreads;    

  private void getThread() {
     AllThreads = (from sc in db.ScreenCycles
                      join s in db.Screens on sc.ScreenID equals s.ScreenID
                      select s.Screen1 + " " + sc.Thread);
  }
}

根据 Joel 的建议进行了更新。

【讨论】:

  • 关闭,但最好避免使用 .ToList()。
  • 另外,我认为他不会返回字符串。
【解决方案2】:

初始 var 定义了一个匿名类。为了做你必须定义的类。

但是......你可能只是这样做:

List<string> AllThreads;

【讨论】:

    【解决方案3】:

    var 只能用作本地声明。如果要使用从 LINQ 表达式返回的类型,则必须构建一个对象。

    【讨论】:

      【解决方案4】:

      要保留您的原始代码,请尝试此操作

      public class foo
      
          IEnumerable<ScreenCycles> AllThreads;
          private void getThread()
          {
             AllThreads = from sc in db.ScreenCycles
                                join s in db.Screens on sc.ScreenID equals s.ScreenID
                                select s;
          }
      
      }
      

      【讨论】:

      • 看起来他选择的是“Screens”而不是“ScreenCycles”
      • 是否值得指出原来的类设计有缺陷,一般不应该返回 IEnumerable?诚然,您回答的确切内容对所提出的问题有效,但最终,该建议存在根本缺陷(作为问题的直接结果)。
      • 我完全不同意。通常,您应该返回 IEnumerable,除非您有充分的理由返回一个不太通用的类型。但是,存储依赖于实时数据库连接的 IEnumerable 而不首先调用 ToArray 或 ToList 可能不是一个好主意。
      【解决方案5】:

      您不能在班级级别使用var。如果不立即初始化,则需要提供显式类型。

      假设“s”的类型名称为“Screen”:

      public class foo
      {
          IEnumerable<Screen> AllThreads;
          private void getThread()
          {
             AllThreads = from sc in db.ScreenCycles
                                join s in db.Screens on sc.ScreenID equals s.ScreenID
                                select s;
          }
      }
      

      【讨论】:

        【解决方案6】:

        正如许多人所说,您不能使用 var。重构您的代码以使用 Linq 类型。

        public class foo 
        {
            ScreenCycle[] allThreads;
            private void getThread() 
            { 
                allThreads = (from sc in db.ScreenCycles join s in db.Screens on sc.ScreenID 
                             equals s.ScreenID select s).ToArray(); 
            } 
        }
        

        【讨论】:

          【解决方案7】:

          好的,这不是答案,只是 stackoverflow 问题的一个相对新手,这个帖子很好地说明了这一点。

          这个网站上的代码标记工具真的很……嗯,独一无二。在这种特殊情况下,我不明白的是,为什么我们所有的评论代码块都非常长?这是OP做的吗?我厌倦了对前面示例的各种编辑,并且由于某种原因,我的代码所在的文本框比其内容长得多。 (即 8)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-23
            • 2014-08-15
            • 2019-01-06
            • 2019-01-21
            相关资源
            最近更新 更多