2016-07-20 46 views
0
dynamic d = "hello"; 
Console.WriteLine (d.ToUpper()); // HELLO 
Console.WriteLine (d.Foo()); // Compiles OK but gives runtime error 

我在读一本书,在本节的跌跌撞撞,在第三行,只在运行时抛出的错误,但它会编译即使Foo方法不存在。动态可变编译

为什么不在编译时检查它,而不是在运行时?

编辑: 什么意义,什么时候可以使用这个概念?

+0

你可以把它标记为重复的,我在这篇文章中唯一的目标是从有经验的程序员那里得到输入,你不能在书中甚至在一些文章中找到它。 – Sherlock

回答

4

使用dynamic,您正在指示编译器忽略它并让运行时处理它。这在处理COM和编译器不知道的其他接口时非常有用。

如果你想隐式类型使用var来代替。编译器会推断出这个类型并保持它的强类型。

+0

我什么时候可以使用这种技术?或使用它的正确方法? – Sherlock

+3

@Desperado,你正在阅读的书也应该有正确使用的解释。否则,在SO搜索中,存在充足的类似问题。 – Rahul

+0

@Rahul是的,我读过它,但并不是所有的概念和技巧都存在。我们不能争辩说,当我们遇到经验丰富的程序员 – Sherlock

4

dynamic -keyword导致了此行为。当制作一个变量dynamic时,你可以做所有的东西,因为它使编译时不安全。所以通过使dynamic完全绕过编译时类型 - 这就是为什么你在使用它时应该小心。

虽然在运行时检查成员是dynamic的全部点 - 为什么它应该存在,否则?

我以为你故意想让var -keyword这你编译时安全。看看this point for the difference on both。至于使用关键字看看this post

+0

我什么时候可以使用这种技术?或使用它的正确方法? – Sherlock

+0

通常根本没有,只有露水的情况下,你应该使用它。无论如何,只要你不需要*显式*,我就不会太在意。 – HimBromBeere

+0

感谢兄弟!即使我失去了我的一些声誉,这也是有帮助的。T.T版主感叹 – Sherlock