gpt4 book ai didi

c# - 为什么我们使用 ref 参数得到 ArrayTypeMismatch?

转载 作者:行者123 更新时间:2023-11-30 15:35:27 25 4
gpt4 key购买 nike

鉴于场景:

public class Program
{
static void Main()
{
object[] covarientArray= new A[] { new A() };
object polymorphism = new A();
object test = covarientArray[0];
M(ref polymorphism);//fine up to here

M(ref covarientArray[0]);//ArrayTypeMismatchException
}

static void M(ref object o) { Console.WriteLine(o); }
}
class A {}

和定义ArrayTypeMisMatch:

The exception that is thrown when an attempt is made to store an element of the wrong type within an array.

当尝试在数组中存储错误类型的元素时,会抛出此异常。例如:

A[] invalid = new A[1];
invalid[0] = "";//I can't store a type of string within an array of type of A

这个异常是怎么发生的?为什么在调用带有ref参数的方法时,我们正在执行存储操作?

最佳答案

在为错误类型的数组元素创建 ref 时也会抛出异常。诚然,仅阅读异常文本还不清楚这一点,但在您链接到的页面上间接地非常简短地提到了这一点:

The following Microsoft intermediate language (MSIL) instructions throw ArrayTypeMismatchException :

ldelema

ldelema (加载元素地址)是用于创建对数组元素的引用的指令。

至于为什么,它可以防止 everyevery ref 参数的赋值需要对类型进行运行时检查。

关于c# - 为什么我们使用 ref 参数得到 ArrayTypeMismatch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14944475/

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