为什么C#动态类型是静态的?

sla*_*dhe 56 c# dynamic c#-4.0

在阅读和探索我在[MSDN]上的以下行中找到的动态关键字时(在使用类型动态(C#编程指南)中):

类型是静态类型,但动态类型的对象绕过静态类型检查.在大多数情况下,它的功能类似于它具有类型对象.

静态在上面的行是什么意思,它如何绕过静态类型检查?

Mat*_*and 115

这是静态类型:

string foo = "bar";
Run Code Online (Sandbox Code Playgroud)

foo 现在是一个字符串,所以这将导致编译时错误:

foo = 1;
Run Code Online (Sandbox Code Playgroud)

即使你使用var它,它仍然是静态类型:

var foo = "bar";     // foo is now a string
foo = 1;             // still a compile time error
Run Code Online (Sandbox Code Playgroud)

使用dynamic关键字意味着类型不是静态的并且可以更改,所以现在你可以这样做:

dynamic foo = "bar";   
foo = 1;              // this is now fine.
Run Code Online (Sandbox Code Playgroud)

现在,为什么它说"类型是静态类型"是因为在许多动态语言(如Javascript)中,你可以这样做:

var foo = { bar: 1 };
Run Code Online (Sandbox Code Playgroud)

这会创建一个名为"bar"的对象,然后你可以这样做:

foo.la = 2;
Run Code Online (Sandbox Code Playgroud)

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

dynamic foo = new SomeClassThatDoesntHaveABarProperty();
foo.bar = 2;          // runtime error
Run Code Online (Sandbox Code Playgroud)

你也不能删除一个属性.您可以将任何类型分配给动态变量,但不能自行更改这些类型.

如果您确实需要这种类型的功能,那么您将需要查看ExpandoObject

正如您的描述所说,dynamic在很多情况下,它就像一个对象.你可以这样做:

dynamic foo = new Foo();
foo = new Bar();
Run Code Online (Sandbox Code Playgroud)

就像这样:

object foo = new Foo();
foo = new Bar();
Run Code Online (Sandbox Code Playgroud)

但是,当您想要使用属性或方法时,会出现差异.有了动态,我可以这样做:

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

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

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

其中,如果我已经知道我可以投的类型,我只能做foo一个类型的Foo ,在编译时,如果我早就知道了,那么我可以只是用Foo我的类型,而不是object.

  • 我现在有一种想法,根据他们做的*不具备的属性和方法来命名我的类. (20认同)
  • 很好的答案,我觉得我的大脑刚刚扩大了一点. (3认同)
  • @DanNeely:不会.当你使用`dynamic`时,你失去了知识分子. (2认同)

T_D*_*T_D 1

这意味着声明为动态的变量将保持动态类型,并且不能更改为 int 类型的变量。不过,这个概念被绕过了,因为您可以更改变量所保存的对象的类型。

C# 被认为是强类型语言,因为变量是静态类型的。这意味着每个变量都有类型,C# 编译器可以检查代码中是否使用了正确的类型。在像大多数脚本语言一样的弱类型语言中,变量的类型是动态的。它们可以持有任何价值。