为什么C#dynamictypes是静态的?

在读取和浏览dynamic关键字时,我在[MSDN](在使用typesdynamic(C#编程指南) )中find以下行:

该types是静态types,但dynamictypes的对象绕过了静态types检查。 在大多数情况下,它具有types对象的function。

静态在上面的含义是什么,它如何绕过静态types检查?

这是静态types:

 string foo = "bar"; 

foo现在是一个string,所以这会导致编译时错误:

 foo = 1; 

即使你使用var ,它仍然是静态types的:

 var foo = "bar"; // foo is now a string foo = 1; // still a compile time error 

使用dynamic关键字,意味着types不会是静态的,可以改变,所以现在你可以这样做:

 dynamic foo = "bar"; foo = 1; // this is now fine. 

现在,为什么它说“该types是一个静态types”是因为在许多dynamic语言(如Javascript),你可以做这样的事情:

 var foo = { bar: 1 }; 

它创build一个名为“bar”的属性的对象,然后你可以这样做:

 foo.la = 2; 

它为foo的对象添加了一个新的属性。 但是,如果你在C#中尝试相同的技巧

 dynamic foo = new SomeClassThatDoesntHaveABarProperty(); foo.bar = 2; // runtime error 

你也不能删除一个属性。 您可以将任何types分配给dynamicvariables,但不能自行更改这些types。

如果您确实需要这种types的function,那么您需要查看ExpandoObject

正如你的描述所说, dynamic函数就像很多情况下的一个对象。 你可以这样做:

 dynamic foo = new Foo(); foo = new Bar(); 

就像这样:

 object foo = new Foo(); foo = new Bar(); 

但是,当你想要使用属性或方法的差异。 随着dynamic,我可以这样做:

 dynamic foo = new Foo(); foo.FooMethod(); // Note: You WILL get a runtime exception if foo doesn't have a FooMethod 

但是有了一个对象,我需要这样做:

 object foo = new Foo(); ((Foo)foo).FooMethod(); // Note: I HAVE to know the type at compile time here 

我只能这样做,如果我已经知道我可以在编译时将 footypes转换为Footypes,并且如果我已经知道了,那么我可以使用Foo作为我的types而不是object

这意味着声明为dynamic的variables将保持dynamictypes,例如,不能将其更改为types为int的variables。 尽pipe这个概念被绕过了,因为你可以改变variables持有的对象的types。

C#被认为是强types语言,因为variables是静态types的。 这意味着每个variables都是键入的,C#编译器可以检查代码中是否使用了正确的types。 在像大多数脚本语言那样的弱types语言中,variables的types是dynamic的。 他们可以持有任何价值。