"方法"的类型是什么?本身在C#中?

时间:2018-02-09 16:32:06

标签: c# types

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

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

当然,我试过这个:

var func = new TestClass().TestMethod; //TestMethod is a method of TestClass

然而我只得到了这个错误。

CS0815    Cannot assign method group to an implicitly-typed variable 

可以将方法分配给Func<..., TResult>类型的变量。我用Func和返回字符串的方法测试,然后我得到了这个:

// Result of
// Func<string> func = new TestClass().TestMethod;
// func.GetType();
Instance TestClass -> TestMethod Type : System.Func`1[System.String]

但它是Func<string>的类型名称。那么,方法的真正类型名是什么?

编辑2018年2月10日上午01:46,KST(GMT +09:00)

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

3 个答案:

答案 0 :(得分:6)

方法没有类型。方法就是它们 - 只是&#34;可调用函数&#34;在一个对象或类。您可以将它们分配给具有相同签名的DelegatesFunc这一事实只是框架的一个功能,但该方法本身并没有任何&#34;类型&#34;

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

答案 1 :(得分:3)

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

C#中的方法是将函数附加到类的面向对象的方法,但它们不是一等公民,因为函数是在JavaScript中。

这就是为什么你不能为变量分配方法。

你不能这样做:

var func = Int32.Parse;

但你可以这样做:

Func<string, int> func2 = Int32.Parse;

在第二个例子中,尽管看起来你实际上是在为一个变量分配方法,但实际情况是编译器创建了一个Func<string, int>的新实例,它是一个委托(最终来自{ {1}})碰巧实际上持有对方法本身的类型安全引用。

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

答案 2 :(得分:2)

所有东西都是从System.Object派生出来的,但并非一切都是一件事。

Object.GetType()解释说:

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

类,派生自System.Object,

值类型,派生自System.ValueType。

接口,从.NET Framework 2.0开始,从System.Object派生。

枚举,派生自System.Enum。

委托,派生自System.MulticastDelegate。“

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