【发布时间】:2013-07-14 15:40:25
【问题描述】:
你觉得这个问题很奇怪吗?是的,发生的事情也很奇怪。让我解释一下。
我从这个Covariance and Contravariance with C# Arrays找到了一个sn-p
string[] strings = new string[1];
object[] objects = strings;
objects[0] = new object();
Jon skeet 解释说,上面的代码会抛出 ArrayTypeMismatchException,正如所说的那样。
我所做的是我在第 3 行设置了一个断点,使用 DebuggerVisualizer 我手动设置了 objects[0] = new object() 它不会抛出任何错误并且它可以工作。稍后检查 strings[0].GetType() 返回 System.Object。不仅System.Object任何类型都可以通过上述过程在string[]中设置。
我不知道这是怎么发生的
很想知道背后发生了什么。谁能解释一下。
Edit1 这甚至很有趣
重现上述行为后试试这个
int len = strings[0].Length;
如果您将鼠标放在属性长度上,则显示 strings[0].Length threw ArgumentException 并带有消息 Cannot find the method on the object instance 但实际上它不会引发异常并且代码运行会产生结果 len=0
【问题讨论】:
-
+1。我刚刚用 VS2008 对其进行了测试,并且可以确认这种行为。不过,这可能是调试器中的一个错误。
-
@varocarbas:我已经创建了一个屏幕截图,也许这可以解决问题:tinypic.com/r/4kh10z/5。注意立即窗口中执行的内容。
-
@Heinzi 我们不能说这是调试器中的错误。即使是运行时也不应该允许这样做。不是吗?
-
@SriramSakthivel:由于(据我们所知)只能通过使用调试器功能(即时窗口或自动/本地/...窗口)生成(错误)分配,因此它很可能是调试器中的赋值比编译代码的赋值更不安全。这就是为什么我怀疑调试器中存在错误,直到我们找到一种无需使用断点和 VS 调试功能即可重现此行为的方法。
-
这太酷了。因此,如果您停止并调试,您可以将任何引用类型放入任何其他引用类型变量中。如果程序继续使用
string s = strings[0]; Console.WriteLine(s.GetType());会发生什么?您可以分离调试器并让程序再次运行,在s中使用非字符串。
标签: c# arrays covariance