将类型'var'传递给C#中的方法

时间:2013-01-11 15:26:50

标签: c#

我有一些数据类型为var的子查询。这些正在开发数据表。我想将这些传递给另一种方法,我该怎么做? 例如:

    var subquery1= from results in table.AsEnumerable()
               where //some condition
               select new
               {
                  column1=results.field1,
                  column2 = results.field2
                  etc.,
               }
     var subquery2= from results in table.AsEnumerable()
               where //different condition
               select new
               {
                  column1=results.field1,
                  column2 = results.field2
                  etc.,
               }

现在,我想定义一些方法将这些subquery1,subquery2作为变量传递。 例如:

void updategrid(var queries)
          {
          //some logic
           }

执行方法:

updategrid(subquery1);
updategrid(subquery2);

当我尝试在方法中使用var时,定义它并不喜欢它。请帮我说明怎么做。 感谢。

7 个答案:

答案 0 :(得分:30)

您的结果是一系列匿名对象。 var关键字只是对编译器说“嘿,从使用中推断出我的参数”。从使用中推断出类型的过程称为Type Inference。但是你不能说C#编译器在方法声明中推断出方法参数的类型。此外,如果anonymous objects你不能指定他们的名字。所以你不应该在外面和其他方法中传递它们。您可以将它们转换为dynamic,然后通过CallSite访问其成员(编译器在您访问myDynamic.Name等动态对象的成员时创建它们),或者您可以将匿名对象强制转换为{{1}并通过反射访问其属性,但所有这些方法都是非C#惯用的,并且真正忽略了匿名对象的重点。 而不是在查询中创建匿名对象

object

创建自定义类型

select new
{
  //members selection
}

并将其作为查询的结果进行实例化,如下例所示:(您可以用public class Result { //Members declaration } 替换var代替IEnumerable<Result> - 编译代码将是相同的)

IEnumerable<Result> subquery1 = from results in table.AsEnumerable()
                                where //some condition
                                select new Result
                                {
                                     //fill members here
                                }

方法看起来像

void updategrid(IEnumerable<Result> queries)
{
    //some logic here with strongly typed sequence
}

然后你会像updategrid一样调用updategrid(subquery1),你将拥有updategrid

主体中所有元素的静态类型序列的美丽

答案 1 :(得分:10)

void updategrid(var queries)

无效C#。

var是语法糖 - 变量有一个类型,但如果编译器可以静态地确定它应该是什么,则不需要声明它。

使用参数,编译器没有足够的信息来确定类型。

同样,如果没有赋值,则无法使用var声明变量:

var something;

您需要确保subquery1subquery2的类型和updategrid的参数都相同。

答案 2 :(得分:9)

Var不是数据类型。它是“在编译应用程序时弄清楚这实际是什么数据类型”的简写。您可以弄清楚数据类型实际是什么,并将其用于您的参数,或者您可以创建一个适用于任何数据类型的通用函数。

答案 3 :(得分:8)

您可以使用var类型的参数声明方法。但你可以这样写:

static void updategrid(dynamic queries)
{
} 

var表示take type from right-hand side and declare variable with this type from left-hand side,这是在编译时处理的。正如您所见,使用var作为方法参数类型是没有意义的。

答案 4 :(得分:4)

使用Objectdynamic

void updategrid(object queries)

void updategrid(dynamic queries)

var - &gt;由表达式右侧确定的静态类型。不能用作参数/返回类型

object - &gt;所有.NET类型的基类。

dynamic - &gt;类型在运行时解析。因此,不进行编译时检查,并且智能感知不可用。它也有性能成本。

答案 5 :(得分:2)

在C#中,没有'var'类型。 'var'只是一个关键字,它告诉编译器“分析接下来要找出的类型”。这是在编译期间完成的,而不是运行时。

您所说的变量实际上是作为编译时编译器自动生成的匿名类型输入的。这些类型由于没有名称,因此不能用于声明参数类型或返回值。

您应该为此数据创建显式类,或者在.Net4或更高版本中使用Tuple&lt;&gt;通用类型。

答案 6 :(得分:0)

您可以使用dynamic引用,但我不会那样做。

相反,更好的选择是为这些数据类型创建实际的类,并将它们传递给方法。

例如:

public class MyColumns
{
   public string column1 {get;set;}
   public string column1 {get;set;}
   //etc.
}

你可以这样创建:

var subquery1= from results in table.AsEnumerable()
               where //some condition
               select new MyColumns
               {
                  column1=results.field1,
                  column2 = results.field2
                  //etc.
               };

并且有这样的功能:

public void updategrid(IEnumerable<MyColumns> queries)
{
}