2011-04-06 91 views
3

我最近正在处理一些动态的搜索表达式,并在尝试搜索多个日期/时间时遇到了一些问题。DateTime []和Object []问题

我SearchExpression构造类似于以下(为了简洁一些省略):

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

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

两个,因为他们应该通过以下时,这些工作:

  • 字符串
  • 号码(或任何数值数据)

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

我有当谈到基于类型我所有的数据分隔(日期时间,数值或字符串),并检查的有效性,他们再存入数组传递给适当的表情,就像这样:

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

所有这些工作,当我通过上述任何一个,除了一个DateTime参数数组。

所以我的问题,这让我感觉有点傻,就是我为什么能传递一个DateTime值作为一个对象,但我无法传递一个DateTime[]object[]

实施例:

DateTime[] dateParameters; 

//This works fine 
new SearchExpression("DateTime", ComparisonOperator.Equals, dateParameters[0]); 

//This fails to work 
new SearchExpression("DateTime", ComparisonOperator.Equals, dateParameters, 
        BooleanOperator.Or); 
+0

究竟是如何失败?编译错误?运行时异常?或意外的行为?任何错误的细节都会有帮助。 – gnomed 2011-04-06 16:45:24

+0

这只是一个无效的参数错误 - 当试图传入DateTime []时。 – 2011-04-06 16:47:45

回答

1

这是固有其中阵列不支持阵列不值类型支持Covariance的问题。

Eric Lipperthere上有非常好的帖子。


解决方案

更改方法签名IEnumerable<object>

+0

感谢您的文章Aliostad!我曾考虑过最初使用IEnumerable,但我想在选择使用数组时感觉很经典。非常感激! – 2011-04-06 16:49:11

+0

没问题。希望它能帮助你。 – Aliostad 2011-04-06 18:25:41

0

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

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

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

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

2

为什么我可以通过一个单一的DateTime 值作为一个对象?

存在从DateTime(值类型)到object的隐式装箱转换。

但是我无法通过DateTime []作为 对象[]吗?

没有从DateTime[]object[]的隐式转换。尽管C#exhibit covariance中的数组一般(例如,存在从string[]object[]的隐式转换),但是而不是扩展到值类型的数组 - 当前需要协变转换以进行身份​​保持转换,这是有充分理由的。

+0

谢谢Ani - 我很感激它(也感谢协变的帖子!) – 2011-04-06 17:10:35