我正在研究一个参数为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[]
。
(注意,我所说的param是第一个(primaryKey)。
(注意:我使用primaryKey参数调用的方法是SqlCeResultSet.Seek
,它也需要object[]
)
答案 0 :(得分:3)
您可以在某些情况下接受参数数组,这允许您提供1到n个对象或单个数组。像
这样的东西public static void MyMethod(params object[] values) { }
问题是params数组必须是方法的最终参数。如果您需要在最终参数之前选择具有单个对象或对象数组,则必须提供与原始代码类似的重载。您的代码看起来像是在尝试使用第一个参数,所以您的答案是重载是您的朋友,因为您无法在不使用params关键字的情况下传入期望对象数组的对象,并且这不是一个选项除了最后一个参数之外的任何东西。
编辑根据附加信息,SqlCeDataReader.Seek
确实将params数组作为其最终参数,所以是的...您可以使用单个对象,多个对象或一组对象。
这些电话都是合法的
Seek(DbSeekOptions.After, someObject);
Seek(DbSeekOptions.After, someObject, anotherObject);
Seek(DbSeekOptions.After, objectArray);
Seek(DbSeekOptions.After);
答案 1 :(得分:1)
是的,您需要重载该方法,因为将单个对象传递给接受对象数组的方法将在编译时产生错误。
如果你想要反过来,它实际上是有效的,你可以这样做:
public static void MergeRow(object primaryKey, object[] rowValues)
{
if ( primaryKey is object[] )
{
// is an array of objects
}
else
{
// is a single object
}
}
答案 2 :(得分:1)
object
和object[]
不一样,您通常无法互换它们。 C#中没有任何东西可以在幕后转换它们 - 你可能会遇到parameter arrays之前你已经看过它的地方。
这是一种特殊情况,其中方法调用将接受可变长度的单个对象列表作为方法的最后一个“参数”,允许调用者为方法调用指定任意数量的附加参数。
这些可能是你传递一个对象的情况,其中函数定义表明它需要一个对象的数组。
由于你的函数正在使用多个数组并传递它们,如果你想要消除最终用户必须将它们的单个对象封装在一个数组中,那么你需要同时提供它们。
老实说,作为一名API消费者,如果你把单一对象重载掉了,我不会被冒犯;)
答案 3 :(得分:1)
如果您只使用第一个签名,并使用object
,则可以传入object[]
并且编译正常。
然而:
object[]
,并将其视为与object
仅仅object
区别对待。object[]
参数的方法可能不会期望能够传递object[]
。object
是something[]
但something
不是{{1}}。答案 4 :(得分:0)
正如其他人所说,并且按照 womp 的帖子,我想指出对象和对象[]是不可互换的,你正在体验到已经描述的内容。 SqlCeDataReader.Seek 函数定义为:
public bool Seek (
DbSeekOptions dbSeekOptions,
params Object[] index
)
您可以在此处找到有关参数数组的更多信息:
http://msdn.microsoft.com/en-us/library/w5zay9db(VS.71).aspx