是否必须始终将Invoke的args参数设置为Object()?

时间:2015-11-18 16:30:50

标签: c#

.Invoke方法需要将args参数设置为new object[],这是必要的吗?我的意思是我可以将其设置为new string[]或直接不使用数组吗?例如,我可以像这样使用它:

        this.Invoke(delegate, "Some text");

或者像这样:

        this.Invoke(delegate, new string[] { "Some text"} );

或将其设为new object[]是必须的?

        this.Invoke(delegate, new object[] { "Some text"} );

道歉,如果它听起来很蹩脚,但我检查的每个代码都使用Object数组甚至是MSDN,而我知道将它用作String更快,但是必须有一个原因,为什么每个人都使用一个对象,这就是为什么我问。在高级中感谢您的答案。

1 个答案:

答案 0 :(得分:1)

this.Invoke(delegate, "Some text");this.Invoke(delegate, new object[] { "Some text"} );会让您传入new object[] { "Some text"}

但是,执行this.Invoke(delegate, new string[] { "Some text"} );会导致对象被包裹,您将传入new object[] { new string[] { "Some text" } }

更新:我刚刚测试了这个并且我似乎错了,我100%肯定行为是不同的。使用string[]时,所有3种调用方式都会产生相同的结果。我描述的行为仅在类型不可隐式转换时发生,例如使用int[]时。

Here is a example program showing the behavior

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Testing string[]");
        var test = new string[1] {"example"};
        Example(test);

        Console.WriteLine();
        Console.WriteLine("Testing int[]");     
        var test2 = new int[1] {0};
        Example(test2);
    }

    public static void Example(params object[] test)
    {
        Console.WriteLine("Array Type: {0}", test.GetType());
        Console.WriteLine("test[0] Type: {0}", test[0].GetType());
    }
}

/* Outputs:
Testing string[]
Array Type: System.String[]
test[0] Type: System.String

Testing int[]
Array Type: System.Object[]
test[0] Type: System.Int32[]
*/