我得到匿名类型的成员在转换为shortdate时必须用成员赋值声明

本文关键字:成员 shortdate 声明 赋值 类型 转换 | 更新日期: 2023-09-27 17:59:04

我使用的是.net 3.5 WCF,我需要将日期字段"r.DateReceived"强制转换为shortdate。什么时候我尝试使用.toShortDateString(),得到警告"匿名类型成员必须用成员赋值声明"。结果将转换为Json。

var json = from r in results
                       select Convert(new
                       {
                           r.CaseId,
                           r.TamisCaseNo,
                           r.TaxPdr,
                           r.OarNo,
                           r.Tin,
                           r.DateReceived,
                           r.IdrsOrgAssigned,
                           r.IdrsTeAssigned,
                           r.DateRequestComp
                       });

我得到匿名类型的成员在转换为shortdate时必须用成员赋值声明

来自MSDN:

如果未在匿名类型中指定成员名称,编译器将为匿名类型成员提供与用于初始化它们的属性相同的名称。必须为正在使用表达式初始化的属性提供名称

因此,只有当初始值设定项直接绑定到属性或字段时,才能推断出匿名类型的属性名。如果您正在调用一个方法或有其他类型的表达式,则需要显式指定属性名称,如下所示:

var json = from r in results
                   select Convert(new
                   {
                       r.CaseId,
                       r.TamisCaseNo,
                       r.TaxPdr,
                       r.OarNo,
                       r.Tin,
                       DateReceived = r.DateReceived.ToShortDateString(),
                       r.IdrsOrgAssigned,
                       r.IdrsTeAssigned,
                       r.DateRequestComp
                   });

另一个选项,如果您有一个应该为null的变量,并且您正在通过EF向DB进行查询,并且编译器将调用解释为不可为null,但运行时抛出一个可为null的对象,则必须有一个值错误:

            var queryResults = query
                .Select(
                    g => new
                    {
                        g.Id,
                        g.Latitude,
                        g.Longitude,
                        ParentId = (long?)g.ParentObj2Objs.FirstOrDefault().ParentId
                    })
                .ToList();

您可以看到,ParentId在ParentObj2Objs类型上是不可为null的,所以编译器就像"ParentId"在匿名类型上是Int64类型一样。除了"FirstOrDefault()"可以返回null,从而使查询出错。但是,如果强制它(long?),则可以避免这个问题,因为匿名类型上的ProviderId被正确解释。