我听说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<..., 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 )。这是对的吗?
答案 0 :(得分:6)
方法没有类型。方法就是它们 - 只是&#34;可调用函数&#34;在一个对象或类。您可以将它们分配给具有相同签名的Delegates
或Func
这一事实只是框架的一个功能,但该方法本身并没有任何&#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。“
实例方法不是其中之一,除了类之外没有任何意义。