我正在研究一个接受object[]参数的方法。但是如果我传入一个值(即一个object),它仍然可以工作。
这是作为C#的一部分内置的吗?object和object[]是一样的吗?
我这样问,因为有时我需要传入一个对象数组,而有时我只需要一个对象,我想知道我是否需要这样做:
public static void MergeRow(object primaryKey, object[] rowValues)
{
MergeRow(new object[]{primaryKey}, rowValues);
}
public static void MergeRow(object[] primaryKey, object[] rowValues)
{
// Rest of my method或者第一个签名就足够了,我可以随心所欲地传入一个数组或一个对象?
基本上我是在问,我需要重载这个方法吗?
我可以这样做吗:
public static void MergeRow(object primaryKey, object[] rowValues)
{
// Rest of my method并传入object或object[]。
(请注意,我正在谈论的参数是第一个参数(primaryKey)。
(注意:我使用primaryKey参数调用的方法是SqlCeResultSet.Seek,它也接受一个object[])
发布于 2010-07-03 06:24:49
在某些情况下,您可以接受参数数组,这允许您提供1到n个对象或单个数组。就像这样
public static void MyMethod(params object[] values) { }问题是params数组必须是该方法的最后一个参数。如果您需要在最后一个参数之前使用单个对象或对象数组,则必须像原始代码一样提供重载。您的代码看起来像是在尝试使用第一个参数,所以您的答案是重载是您的朋友,因为如果不使用params关键字,就不能传入需要对象数组的对象,而且除了最后一个参数之外,这不是一个选项。
编辑参数基于附加信息,SqlCeDataReader.Seek确实采用参数数组作为其最终参数,所以是的……您可以使用单个对象、多个对象或对象数组来调用它。
这些通话都是合法的
Seek(DbSeekOptions.After, someObject);
Seek(DbSeekOptions.After, someObject, anotherObject);
Seek(DbSeekOptions.After, objectArray);
Seek(DbSeekOptions.After);发布于 2010-07-03 06:31:00
是的,您需要重载该方法,因为将单个对象传递给接受对象数组的方法将在编译时产生错误。
编辑
如果你想反其道而行之,它实际上是有效的,你可以这样做:
public static void MergeRow(object primaryKey, object[] rowValues)
{
if ( primaryKey is object[] )
{
// is an array of objects
}
else
{
// is a single object
}
}发布于 2010-07-03 06:31:52
object和object[]是不同的,您通常不能将它们互换。在C#中没有任何东西会在幕后改变它们--您可能会遇到以前见过这种情况的parameter arrays。
这是一种特殊情况,在这种情况下,方法调用将接受长度可变的单个对象列表作为方法的最后一个“参数”,允许调用者为方法调用指定任意数量的附加参数。
这些情况很可能是当你传递一个对象时,函数定义说明它需要一个数组。
由于您的函数接受多个数组并传递它们,因此如果您希望最终用户不必将其单个对象封装在一个数组中,那么您需要同时提供这两个对象。
不过,老实说,作为一个API使用者,如果您忽略了单对象重载,我不会生气;)
https://stackoverflow.com/questions/3169433
复制相似问题