我有一个方法ExecuteQuery,它返回一个Datatable对象,它是对象_dataAccess的一个方法,这将在不使用System.Data的情况下正确编译。
string query = "select * from UserNeeds where userNeedID =" + item.ParentId;
var result = _dataAccess.ExecuteQuery(query, CommandType.Select);
foreach (var rows in result.Rows)
{
}但是,如果我更改var,如果给出原始类型的Datatable,它将显示复杂的时间误差,因为我们错过了System.Data。
我的问题是,当我们将System.Data保持为类型时,编译器如何理解var是名称空间。
或者,当我们使用原始datatype代替var时,它为什么要强迫编译器处理相同的内容呢?
发布于 2016-11-24 09:12:59
var本身不是一个类型,它是将由编译器解析的实际类型的占位符。由于DataRowCollection(https://msdn.microsoft.com/en-us/library/ms135386(v=vs.110%29.aspx)(returned by DataRable.Rows)不实现IEnumerable<DataRow>,而只实现非泛型IEnumerable接口,所以foreach对象rows是Object类型。所以不能在循环中使用DataRow属性和方法。
你需要每次都抛出它,或者让它被foreach抛出
foreach (DataRow row in result.Rows)
{
}现在,您需要将using System.Data添加到文件的顶部,或者使用
foreach (System.Data.DataRow row in result.Rows)
{
}因此,它使用var编译而不添加命名空间的原因是,编译器使用System.Object作为var,因为DataRowCollection生成对象而不是DataRows。
发布于 2016-11-24 09:48:18
命名空间是任何对象的简短表示法。如果您没有指定,那么需要给出完整的对象名称。
Var是一次动态数据类型,一旦它用完整的对象名动态创建,它就会存储对象类型。
https://stackoverflow.com/questions/40782034
复制相似问题