Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 日期时间[]和对象[]问题_C#_Datetime_Object_Casting - Fatal编程技术网

C# 日期时间[]和对象[]问题

C# 日期时间[]和对象[]问题,c#,datetime,object,casting,C#,Datetime,Object,Casting,我最近正在处理一些动态搜索表达式,在尝试搜索多个日期/时间时遇到了一些问题 我的SearchExpression构造函数类似于以下内容(为了简洁起见省略了一些): public SearchExpression(string propertyName, ComparisonOperator comparisonOperator, object value) {...} DateTime[] da

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

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

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,但我想当我选择使用数组时,我感觉自己很经典。非常感谢!没问题。希望它能帮助你。谢谢你,阿尼-我很感激(也谢谢你在协方差上的帖子!)