Sri*_*vel 9 c# arrays covariance
你觉得问题很奇怪吗?是的,发生的事也很奇怪.让我解释.
我从C#Arrays中找到了这个Covariance和Contravariance的片段
string[] strings = new string[1];
object[] objects = strings;
objects[0] = new object();
Run Code Online (Sandbox Code Playgroud)
Jon skeet解释说上面的代码会抛出ArrayTypeMismatchException,正如所说的那样.
我做的是我在第3行放置一个断点,使用DebuggerVisualizer我手动设置objects[0] = new object()它不会抛出任何错误,它的工作原理.稍后检查strings[0].GetType()返回System.Object.不仅System.Object可以通过上述过程在string []中设置任何类型.
我不知道这是怎么发生的我在那里提出我的问题作为评论在同一个问题我看到了这个但没有答案.
我很想知道背后发生了什么.有人解释一下.
在重现上述行为后试试这个
int len = strings[0].Length;
Run Code Online (Sandbox Code Playgroud)
如果你把鼠标放在属性长度上是strings[0].Length threw ArgumentException用消息说,Cannot find the method on the object instance但实际上它不会抛出异常和代码运行产生结果len=0
(我更愿意重写我的答案,因为上一个更新太多并且不够清晰)。
显然,在VS调试部分的工具之一(立即窗口)中发现了不太完美的行为。这种行为(完全)不会影响代码的正常执行,纯粹来说,甚至不会影响调试过程。
我在上面最后一句话中的意思是,当我调试代码时,我从不使用立即窗口,只是编写我想要的任何代码,执行它并查看调试器显示的内容。提到的问题并不影响这个过程(这可以称为“调试实际执行的代码”;在建议的示例中,在打开时按F11 objects[0] = new object();),这意味着VS中存在严重问题。因此,从我的角度(我所做的调试类型)和执行的角度来看,所提到的错误根本没有影响。
此错误的唯一应用是在执行“立即窗口”功能时,这是调试器的一项功能,可在代码实际交付之前估计代码将交付的内容(可能称为“调试未执行的代码”或“估计预期输出”)来自未执行的代码”等;在建议的示例中,在线时objects[0] = new object();,不按 F11,而是使用立即窗口输入值,并让此功能告诉您预期会发生什么)。
总之,所提到的问题必须在正确的上下文中理解,也就是说,它不是一个整体适用的问题,甚至不是整个调试器中的问题(当您在调试器中的所提到的行中按 F11 时,它会输出错误,因此调试器确实完全理解这种情况是错误的),但只是在其工具之一中。我什至不确定这种行为对于这个工具是否可以接受(即,“立即窗口”提供的是一个可能不是 100% 正确的预测;如果您想确定会发生什么,请执行代码并让调试器会向您显示信息)。