Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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#_Types - Fatal编程技术网

什么';这是“的类型”;方法“;用C#表示自己?

什么';这是“的类型”;方法“;用C#表示自己?,c#,types,C#,Types,我听说C#是一种纯粹的面向对象编程语言,因为所有东西都是从System.object派生出来的 所以我怀疑这个方法本身的类型是什么。我尝试使用StackTrace和StackFrame来获取方法的类型,但我只得到了类的名称,声明了哪些方法 当然,我试过: var func = new TestClass().TestMethod; //TestMethod is a method of TestClass 然而,我只得到了这个错误 CS0815 Cannot assign method

我听说C#是一种纯粹的面向对象编程语言,因为所有东西都是从
System.object
派生出来的

所以我怀疑这个方法本身的类型是什么。我尝试使用
StackTrace
StackFrame
来获取方法的类型,但我只得到了类的名称,声明了哪些方法

当然,我试过:

var func = new TestClass().TestMethod; //TestMethod is a method of TestClass
然而,我只得到了这个错误

CS0815    Cannot assign method group to an implicitly-typed variable 
方法可以分配给
Func
类型化变量。我使用Func和返回字符串的方法进行了测试,然后得到以下结果:

// Result of
// Func<string> func = new TestClass().TestMethod;
// func.GetType();
Instance TestClass -> TestMethod Type : System.Func`1[System.String]
//测试结果
//Func Func=新TestClass().TestMethod;
//func.GetType();
实例TestClass->TestMethod类型:System.Func`1[System.String]
但它是
Func
的一个类型名。那么,方法的真正类型名是什么

编辑2018年2月10日凌晨1:46(格林尼治标准时间+09:00)


好的,让我总结一下。函数本身没有类型,也不是对象,
Delegate
/
Func
是.NET Framework的一个功能,可以作为一级公民处理函数(,但它不是FCC)。是否正确?

方法没有类型。方法就是它们——只是对象或类上的“可调用函数”。您可以将它们分配给具有相同签名的
委托
Func
,这只是框架的一个特性,但方法本身没有任何“类型”


与类型最接近的可能是方法的返回值(如果有)。

所有东西都是从System.Object派生的,但不是所有东西都是一个东西

说明:

“由于System.Object是.NET Framework类型系统中所有类型的基类,因此可以使用GetType方法返回表示所有.NET Framework类型的类型对象。.NET Framework可识别以下五类类型:

类,这些类派生自System.Object

值类型,它是从System.ValueType派生的

接口,这些接口派生自从.NET Framework 2.0开始的System.Object

枚举,从System.Enum派生

从System.MulticastDelegate派生的委托。“


实例方法不是其中之一,它除了类之外没有任何意义。

方法不是对象,因此它没有类型

C#中的一种方法是将函数附加到类的面向对象的方式,但它们并不像JavaScript中的函数那样是一等公民

这就是为什么不能将方法分配给变量

你不能这样做:

var func = Int32.Parse;
但是你可以这样做:

Func<string, int> func2 = Int32.Parse;
Func func2=Int32.Parse;
在第二个示例中,尽管看起来您实际上是在为变量指定一个方法,但实际情况是编译器创建了一个
Func
的新实例,该实例是一个委托(它最终派生自
System.Object
),该委托实际上持有对方法本身的类型安全引用


该委托<强>是一个对象,可以作为参数分配和传递给其他方法,但不是方法本身而是包装器。

您可能是从本机C++中常见的,在那里可能分配任何返回T类型的函数,到T上的任何指针,并调用它。嗯,.NETFramework设计团队进行了大量工作,因此您永远不必处理裸指针。代表只是其中的一个替代者。我个人认为这种方法更好,因为编译器可以检查您所做的是否有意义。方法不是对象,因此它没有类型。C#中的一种方法是将函数附加到类的面向对象的方式,但它们并不像JavaScript中的函数那样是一流的公民。你能回顾一下我的总结吗?在问题的末尾。
Delegate
类型和
Func
实际上是类型。但是方法本身没有类型,尽管当方法签名与委托签名匹配时,它们可以表示这些类型的“实例”。尝试以下操作:
typeof(System.Collections.IEnumerable).BaseType
它返回null在这个问题上有一个完整的项目,所以当您对BaseType的理解正确时,您可以执行typeof(System.Collections.IEnumerable).ToString()或typeof(System.Collections.IEnumerable).GetHashCode(),并获得预期的结果。也许这是一个错误,而不是正确的行为,如果你允许规范凌驾于现实生活之上:-)有趣的是,在一句话中,你说我们不能将方法分配给变量,而只是将方法分配给文本下一行中的变量。我看不出编译器如何创建一个委托(变量)的新实例,然后将其分配给一个方法指针,并将其表述为“这不是将一个方法分配给一个变量”——这就是您正在做的事情。将对象引用(或指针)指定给变量和将函数指针指定给变量有什么区别?委托对象不是方法指针,而是类的实例。正如我之前所说的,方法不是对象,因此不能分配给变量。func是编译器创建的匿名类型的对象。您可以使用dotPeek或类似的反编译器工具来实际查看编译器为您创建的内容。委托是一个用于引用方法的类,它将方法指针保存在委托中。这与将对象引用指定给变量有什么不同?编译器将方法赋值编译为委托变量时所做的操作不会改变它将方法赋值给变量的事实(以确切的语义方式,因为对象引用不是类指针,但编译器/CLR使用其指针来引用自身)