C# 为什么有必要';手动';评估或投射对象';到底是什么类型?
所谓手动,我指的是代码,好像我需要迎合,好像对象不是我期望的那样 例如,我正在使用中继器。作为其中的一部分,我正在处理DataSource属性。为此,我必须首先检查以下内容:C# 为什么有必要';手动';评估或投射对象';到底是什么类型?,c#,object,types,.net-4.0,casting,C#,Object,Types,.net 4.0,Casting,所谓手动,我指的是代码,好像我需要迎合,好像对象不是我期望的那样 例如,我正在使用中继器。作为其中的一部分,我正在处理DataSource属性。为此,我必须首先检查以下内容: this.DataSource as List<MyObject> 这个问题显然没有什么花言巧语,我并不是在暗示我应该能够做到这一点,我对答案真正感兴趣。因为被定义为对象,是最基本的类 编译器不知道您在其中输入了什么特定类型,因此如果您想要对它进行静态类型化访问,则需要强制转换它 因为被定义为对象,所以它是最
this.DataSource as List<MyObject>
这个问题显然没有什么花言巧语,我并不是在暗示我应该能够做到这一点,我对答案真正感兴趣。因为被定义为对象,是最基本的类
编译器不知道您在其中输入了什么特定类型,因此如果您想要对它进行静态类型化访问,则需要强制转换它 因为被定义为对象
,所以它是最基本的类
编译器不知道您在其中输入了什么特定类型,因此如果您想要对它进行静态类型化访问,则需要强制转换它 C#是一种静态类型语言。这是故意的。静态类型在可维护性、工具、性能以及其他方面都有好处
在动态类型语言中,您确实可以编写这样的代码。C#语言确实可以这样定义,但选择了不这样定义
静态和动态类型之间的权衡是复杂的,我无法在这个答案中详细阐述。它在许多地方的网络上被广泛讨论
从C#4开始,您还可以强制使用动态语义:
dynamic ds = this.DataSource;
Console.WriteLine(ds.First().Member); //compiles and works or fails at runtime
我建议您尽可能利用静态键入的功能<代码>动态
更像是特殊情况下的逃生舱。C#是一种静态类型语言。这是故意的。静态类型在可维护性、工具、性能以及其他方面都有好处
在动态类型语言中,您确实可以编写这样的代码。C#语言确实可以这样定义,但选择了不这样定义
静态和动态类型之间的权衡是复杂的,我无法在这个答案中详细阐述。它在许多地方的网络上被广泛讨论
从C#4开始,您还可以强制使用动态语义:
dynamic ds = this.DataSource;
Console.WriteLine(ds.First().Member); //compiles and works or fails at runtime
我建议您尽可能利用静态键入的功能
dynamic
更像是特殊情况下的逃生舱。但是如果允许我访问DataSource,就好像它是我期望的列表一样,为什么它不会在那一点上引发异常,但最初允许我这样做呢?你的确切意思是什么?为什么要提供指向Repeater.DataSource
的链接?我找不到asp标记或其他东西。@Eugene:问题的第二行:“例如,我正在使用一个中继器。作为其中的一部分,我正在操作DataSource属性”。但是,假设我被允许访问DataSource,就好像它是我期望的列表一样,为什么在那一点上它不会引发异常,但最初,请允许我这么做?您的确切意思是什么?为什么要提供指向Repeater.DataSource
的链接?我找不到asp标记或其他东西。@Eugene:问题的第二行:“例如,我正在使用一个中继器。作为其中的一部分,我正在操作DataSource属性”。这是一个关于语言设计的问题(“为什么语言就是这样?”),我认为这是有效的。我显然同意。我完全理解,在运行时,如果对象的类型未知,框架无法执行特定类型的任何类型的操作。我只是想问为什么会这样。知道两种类型可以与一个变量(或属性值)相关联可能会有所帮助。变量的编译时类型是您正在编写的程序中变量的类型。当您键入代码时,该类型是已知的。将鼠标放在变量名上,会出现一个工具提示,显示编译时类型。运行时类型是程序运行时存在的对象实例的实际类型。运行时类型通常比编译时类型更“派生”。在您的例子中,编译时类型是object
,而运行时类型是List
。这是一个关于语言设计的问题(“为什么语言就是这样?”),我认为它是有效的。我显然同意。我完全理解,在运行时,如果对象的类型未知,框架无法执行特定类型的任何类型的操作。我只是想问为什么会这样。知道两种类型可以与一个变量(或属性值)相关联可能会有所帮助。变量的编译时类型是您正在编写的程序中变量的类型。当您键入代码时,该类型是已知的。将鼠标放在变量名上,会出现一个工具提示,显示编译时类型。运行时类型是程序运行时存在的对象实例的实际类型。运行时类型通常比编译时类型更“派生”。在您的例子中,编译时类型是object
,而运行时类型是List
。c在c 4.0之前是一种静态类型的语言。之后,它可以表现出静态类型和动态类型(System.Dynamic)的良好行为,这在前面是没有的。现在完美了+1:)c#在c#4.0之前是一种静态类型语言。之后,它可以表现出静态类型和动态类型(System.Dynamic)的良好行为,这在前面是没有的。现在完美了+1 :)