DateTime []和Object []问题

时间:2011-04-06 16:38:50

标签: c# datetime object casting

我最近正在使用一些动态搜索表达式,当我尝试搜索多个日期/时间时遇到了一些问题。

我的SearchExpression构造函数类似于以下内容(为简洁起见省略了一些):

public SearchExpression(string propertyName, 
                        ComparisonOperator comparisonOperator, 
                        object value) {...}

public SearchExpression(string propertyName, 
                        ComparisonOperator comparisonOperator, 
                        object[] values, 
                        BooleanOperator innerBooleanOperator) {...}

这两种方法在传递以下内容时都能正常工作:

  • 字符串
  • 数字(或任何数字数据)

然而,当涉及传递DateTime信息时,我开始遇到一些问题。

我根据类型(DateTime,Numerical或String)将所有数据分开并检查其有效性,然后将它们存储到数组中以传递给正确的表达式,如下所示:

object[] stringParameters;
object[] numericalParameters;
DateTime[] dateParameters;

当我传入上述任何一个时,所有这些都有效,但DateTime参数数组除外。

所以我的问题让我觉得有点愚蠢,这就是为什么我可以将单个DateTime值作为对象传递,但是无法传递 {{ 1}} 作为 DateTime[]

示例:

object[]

3 个答案:

答案 0 :(得分:2)

  

为什么我可以传递单个DateTime   价值作为对象?

DateTime(值类型)到object可以进行隐式装箱转换。

  

但是我无法传递DateTime []   一个对象[]?

DateTime[]object[]没有可用的隐式转换。虽然C#exhibit covariance中的数组一般(例如,存在从string[]object[]的隐式转换),但扩展到值数组 - 类型 - 协变转换目前需要保持身份转换,这是有充分理由的。

答案 1 :(得分:1)

本质上 Covariance的问题 数组不支持 数组不支持值类型

Eric Lippert here上有一篇非常好的帖子。


解决方案

将方法签名更改为IEnumerable<object>

答案 2 :(得分:0)

你也可以传递/转换DateTime []作为对象,但不能作为object [],因为它需要为数组中的每个项目进行转换/转换。编译器会抱怨后者。

您可以编写Static Extension / Linq将DateTime []转换为object []。

当函数期望object []时,它不期望对象数组。

当函数是期望对象时,可以传递DateTime,因为类型为“struct”的DateTime继承自object。希望它有所帮助:)