gpt4 book ai didi

c# - 为什么string[]被解释为object[],而不是object,但是我们可以赋值object obj = new string[]?

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:53 24 4
gpt4 key购买 nike

我目前正在从 this video 学习 Reflection 后期绑定(bind).

当我复制视频中的代码时,有一部分让我感到困惑。当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, string[])。因此,起初我预计会出现编译错误,因为我认为 string[] 是一个 object 而不是 object[]。但是....没有编译错误。

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

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

string[] 如何既是 object 又是 object[]?使用其他数据类型,比方说 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;
}
}
}

最佳答案

根据 MSDN 中的第 12.5 节

For any two reference-types A and B, if an implicit reference conversion (Section 6.1.4) or explicit reference conversion (Section 6.2.3) exists from A to B, then the same reference conversion also exists from the array type A[R] to the array type B[R], where R is any given rank-specifier (but the same for both array types). This relationship is known as array covariance.

下面的代码是完全有效的。

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

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

关于c# - 为什么string[]被解释为object[],而不是object,但是我们可以赋值object obj = new string[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35966180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com