我最近正在使用一些动态搜索表达式,当我尝试搜索多个日期/时间时遇到了一些问题。
我的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[]
答案 0 :(得分:2)
为什么我可以传递单个DateTime 价值作为对象?
从DateTime
(值类型)到object
可以进行隐式装箱转换。
但是我无法传递DateTime [] 一个对象[]?
DateTime[]
到object[]
没有可用的隐式转换。虽然C#exhibit covariance中的数组一般(例如,存在从string[]
到object[]
的隐式转换),但不扩展到值数组 - 类型 - 协变转换目前需要保持身份转换,这是有充分理由的。
答案 1 :(得分:1)
答案 2 :(得分:0)
你也可以传递/转换DateTime []作为对象,但不能作为object [],因为它需要为数组中的每个项目进行转换/转换。编译器会抱怨后者。
您可以编写Static Extension / Linq将DateTime []转换为object []。
当函数期望object []时,它不期望对象数组。
当函数是期望对象时,可以传递DateTime,因为类型为“struct”的DateTime继承自object。希望它有所帮助:)