为什么不是';t编译此代码

本文关键字:编译 代码 为什么不 | 更新日期: 2023-09-27 18:28:21

我正在编写一个方法,以通用IEnumerable作为数据源来生成DataTable。如果没有值,我试图在字段上设置一个默认值,代码如下:

private void createTable<T>(IEnumerable<T> MyCollection, DataTable tabela) 
        {
            Type tipo = typeof(T);
            foreach (var item in tipo.GetFields() )
            {
                tabela.Columns.Add(new DataColumn(item.Name, item.FieldType));
            }
            foreach (Pessoa recordOnEnumerable in ListaPessoa.listaPessoas)
            {
                DataRow linha = tabela.NewRow();
                foreach (FieldInfo itemField in tipo.GetFields())
                {
                    Type typeAux = itemField.GetType();
                    linha[itemField.Name] =
                        itemField.GetValue(recordOnEnumerable) ?? default(typeAux); 
                }
            }
        }

它抛出了这个错误:

找不到类型或命名空间名称"typeAux"(是否缺少using指令或程序集引用?)

为什么?函数"Default(Type)"不应该返回该类型的默认值吗?

为什么不是';t编译此代码

对于引用类型返回null,对于值类型返回Activator.CreateInstance如何

public static object GetDefault(Type type)
{
   if(type.IsValueType)
   {
      return Activator.CreateInstance(type);
   }
   return null;
}

参考:默认(类型)的程序等效

default语句不适用于System.Type

话虽如此,似乎更合适的做法是忽略这一点,直接使用DBNull

linha[itemField.Name] = itemField.GetValue(recordOnEnumerable) ?? DBNull.Value;

如果该值为null,则将结果设置为null(在DataRow中为DBNull.Value)似乎是合适的。