为什么string []被解释为object [],而不是对象,但我们可以分配对象obj = new string []?

时间:2016-03-13 03:39:26

标签: c# arrays object reflection

我目前正在了解来自this videoReflection晚期绑定。

当我复制视频中的代码时,有一部分让我感到困惑。它是在使用Invoke方法的时候:

MethodInfo getFullNameMethod = customerType.GetMethod("GetFullName");
string[] parameters = new string[2];
parameters[0] = "First";
parameters[1] = "Last";

//here is where I got confused...
string fullName = (string)getFullNameMethod.Invoke(customerInstance, parameters);

据我所知(视频中也显示)Invoke的输入参数为(object, object[]),并且没有带输入参数(object, object)的重载方法。

这里传递的内容是(object, string[])。所以,起初我预计会出现编译错误,因为我认为string[]object而不是object[]。但是......没有编译错误。

这让我很困惑:为什么string[]object[]而不是object(每个Type C#毕竟是从object派生的?我们不能像这样string[]分配object吗?

object obj = new string[3]; //this is OK

string[] objectobject[]如何?使用其他数据类型(比如int)作为类比,我绝不会期望变量同时为intint[]

有人可以启发我吗?

Here is my full code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace ConsoleApplication2 {
    class Program {
        static void Main(string[] args) {
            Assembly executingAssembly = Assembly.GetExecutingAssembly();
            Type customerType = executingAssembly.GetType("ConsoleApplication2.Customer");
            object customerInstance = Activator.CreateInstance(customerType);
            MethodInfo getFullNameMethod = customerType.GetMethod("GetFullName");
            string[] parameters = new string[2];
            parameters[0] = "First";
            parameters[1] = "Last";
            string fullName = (string)getFullNameMethod.Invoke(customerInstance, parameters);
            Console.WriteLine(fullName);
            Console.ReadKey();
        }
    }

    class Customer {
        public string GetFullName(string FirstName, string LastName) {
            return FirstName + " " + LastName;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

根据MSDN

中的第12.5节
  

对于任何两个引用类型A和B,如果是隐式引用   转换(第6.1.4节)或显式参考转换(第   6.2.3)从A到B存在,那么从数组类型A [R]到数组类型B [R]也存在相同的引用转换,其中R是任意的   给定rank-specifier(但两种数组类型相同)。 此   关系称为数组协方差

以下代码完全有效。

string[] items = new string[] {"A", "B", "C"};      
object[] objItems = items; 

这就是为什么在您的情况下,传递string[]有效并将转换为object[]