Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么有必要';手动';评估或投射对象';到底是什么类型?_C#_Object_Types_.net 4.0_Casting - Fatal编程技术网

C# 为什么有必要';手动';评估或投射对象';到底是什么类型?

C# 为什么有必要';手动';评估或投射对象';到底是什么类型?,c#,object,types,.net-4.0,casting,C#,Object,Types,.net 4.0,Casting,所谓手动,我指的是代码,好像我需要迎合,好像对象不是我期望的那样 例如,我正在使用中继器。作为其中的一部分,我正在处理DataSource属性。为此,我必须首先检查以下内容: this.DataSource as List<MyObject> 这个问题显然没有什么花言巧语,我并不是在暗示我应该能够做到这一点,我对答案真正感兴趣。因为被定义为对象,是最基本的类 编译器不知道您在其中输入了什么特定类型,因此如果您想要对它进行静态类型化访问,则需要强制转换它 因为被定义为对象,所以它是最

所谓手动,我指的是代码,好像我需要迎合,好像对象不是我期望的那样

例如,我正在使用中继器。作为其中的一部分,我正在处理DataSource属性。为此,我必须首先检查以下内容:

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 :)