gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:46:49 26 4
gpt4 key购买 nike

在阅读和探索动态关键字时,我在 [MSDN] 上发现了以下行(在 Using Type dynamic (C# Programming Guide) 中):

The type is a static type, but an object of type dynamic bypasses static type checking. In most cases, it functions like it has type object.

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

最佳答案

这是静态类型:

string foo = "bar";

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

foo = 1;

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

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

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

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

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

var foo = { bar: 1 };

这会创建一个具有名为“bar”的属性的对象,然后您可以这样做:

foo.la = 2;

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

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

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

如果您确实需要那种类型的功能,那么您会想看看 ExpandoObject

正如您的描述所说,dynamic 在很多情况下都像对象一样发挥作用。你可以这样做:

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

就像这样:

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

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

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

只有当我已经知道我可以将 foo 中的类型转换为 Foo 的类型时,我才能这样做在编译时,并且如果我已经知道了,那么我就可以使用 Foo 作为我的类型而不是 object

关于c# - 为什么 C# 动态类型是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25124664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com