C# 日期时间[]和对象[]问题
我最近正在处理一些动态搜索表达式,在尝试搜索多个日期/时间时遇到了一些问题 我的SearchExpression构造函数类似于以下内容(为了简洁起见省略了一些):C# 日期时间[]和对象[]问题,c#,datetime,object,casting,C#,Datetime,Object,Casting,我最近正在处理一些动态搜索表达式,在尝试搜索多个日期/时间时遇到了一些问题 我的SearchExpression构造函数类似于以下内容(为了简洁起见省略了一些): public SearchExpression(string propertyName, ComparisonOperator comparisonOperator, object value) {...} DateTime[] da
public SearchExpression(string propertyName,
ComparisonOperator comparisonOperator,
object value) {...}
DateTime[] dateParameters;
//This works fine
new SearchExpression("DateTime", ComparisonOperator.Equals, dateParameters[0]);
//This fails to work
new SearchExpression("DateTime", ComparisonOperator.Equals, dateParameters,
BooleanOperator.Or);
和
public SearchExpression(string propertyName,
ComparisonOperator comparisonOperator,
object[] values,
BooleanOperator innerBooleanOperator) {...}
当通过以下测试时,这两项工作应正常进行:
- 弦
- 数字(或任何数字数据)
object[] stringParameters;
object[] numericalParameters;
DateTime[] dateParameters;
当我传入上面的任何一个参数时,所有这些都会起作用,DateTime参数数组除外
所以我的问题让我觉得有点愚蠢,那就是为什么我可以将单个日期时间值作为对象传递,但却无法将日期时间[]
作为对象[]
示例:
public SearchExpression(string propertyName,
ComparisonOperator comparisonOperator,
object value) {...}
DateTime[] dateParameters;
//This works fine
new SearchExpression("DateTime", ComparisonOperator.Equals, dateParameters[0]);
//This fails to work
new SearchExpression("DateTime", ComparisonOperator.Equals, dateParameters,
BooleanOperator.Or);
这本质上是协方差的问题,而数组不支持数组不支持值类型
Eric Lippert在这方面有一个很好的帖子
解决方案
将方法签名更改为IEnumerable
您也可以将/cast DateTime[]作为对象传递,但不能作为对象传递,因为它需要对数组中的每个项进行强制转换。编译器会抱怨后者
您可以编写静态扩展/Linq将DateTime[]转换为对象[]
当函数需要对象[]时,它不需要对象数组
当函数需要对象时,可以传递DateTime,因为DateTime类型为“struct”继承自对象。希望有帮助:)
为什么我可以错过一个约会时间
作为对象的价值
有一个从DateTime
(值类型)到对象的隐式装箱转换
但我无法将日期时间[]作为
对象[]
没有从DateTime[]
到对象[]
的隐式转换。虽然C#中的数组通常(例如,存在从字符串[]
到对象[]
的隐式转换),但这并不扩展到值类型的数组-协变转换当前需要保持身份,这是有充分理由的。它到底是如何失败的?编译错误?运行时异常?还是意外的行为?有关任何错误的详细信息都会很有帮助。这只是一个无效参数错误-在尝试传递DateTime[]时。感谢文章Aliostad!最初我曾考虑过使用IEnumerable,但我想当我选择使用数组时,我感觉自己很经典。非常感谢!没问题。希望它能帮助你。谢谢你,阿尼-我很感激(也谢谢你在协方差上的帖子!)