据我所知,除了.net中的接口外,所有内容都来自于对象.但是我注意到当我按下"." 在界面名称出现Equals方法之后.当我按F12 for equals方法时,它会指向对象类中的equals方法.如果接口不是从对象类派生的,那么equals方法来自哪里?
摘要
typeof(ISomeInterface).BaseType是null; typeof(object).BaseType也是null根据定义.从而:
typeof(object).BaseType==typeof(ISomeInterface).BaseType -> true
Run Code Online (Sandbox Code Playgroud)
它(语义上)可能意味着System.Object一个接口,不是吗?在c#中,所有类都继承自System.Object,但接口不继承.接口实际上是契约,而不是任何类的基类型,并且只能从其他接口派生.
所以我想知道是否typeof(object).BaseType应该与接口相同?
说明
我认为这是基本的数学逻辑.I处理null为0和typeof(object)为1,使得找到的基类型某种类型的就像找到许多的因素.
在这种假设下,null可以是任何类型的推导,例如0任意数量的倍数.并且typeof(object)将是任何类的基本类型,就像1是任何数字的因素,甚至本身.实际归国null的typeof(object).BaseType,但是,打破了这一假设.这似乎说这0是一个因素,1但不是任何其他数字的因素.
此外,如果我们使用一种方法来SomeType递归地找到基类型,我们不能总是说它SomeType不是一个类,因为它BaseType是null,typeof(object).BaseType也是null.
如果这似乎是矛盾的
typeof(object).BaseType==typeof(object) -> true
Run Code Online (Sandbox Code Playgroud)
提出它的基本类型本身,但实际上并不是实体和合同之间的区别?
更新:
我最初说过:
它可能意味着
System.Object一个接口,不是吗?
我想说的是它似乎很困惑.这是我表达不好的描述的错,并且很抱歉导致答案集中在那上面.
我正在尝试模拟ToString()我的自定义对象的调用.我已经为界面创建了一个模拟,并在ToString()通话时设置了期望值
interface ICustomObject
{
}
var customObjectMock = MockRepository.GenerateMock<ICustomObject>();
var fakeDump = Guid.NewGuid().ToString();
customObjectMock.Expect(c => c.ToString()).Return(fakeDump).Repeat.Any();
Run Code Online (Sandbox Code Playgroud)
在测试运行时,我得到了运行时异常说:
System.InvalidOperationException:无效的呼叫,已使用的最后一个呼叫或未进行任何呼叫(确保您正在呼叫虚拟(C#).
众所周知的错误,但为什么我认为它ToString()是虚拟的呢?
而且更有趣 - 我只是通过ToString()在界面中明确定义来解决它:
interface ICustomObject
{
// Weird! I believe such method definition in interface would be confusing
// without a special remark comment saying that this method is redefined
// to satisfy RhinoMocks (perhaps Reflection?)
string ToString();
}
Run Code Online (Sandbox Code Playgroud)
在此之后,RM允许设定期望值ToString().
只是想知道为什么RinoMocks要求我重新定义标准虚拟化Object.ToString()?也许RM不考虑可用于每个框架对象的这种标准方法,并且有义务重新定义所有方法/属性;为了能够设定期望,我们必须这样做?
我听说C#是一种纯粹的面向对象的编程语言,因为所有的东西都源于System.Object.
所以我怀疑方法本身的类型是什么.我尝试使用StackTrace和StackFrame获取方法的类型,但我得到了类的名称,声明了哪些方法.
当然,我试过这个:
var func = new TestClass().TestMethod; //TestMethod is a method of TestClass
Run Code Online (Sandbox Code Playgroud)
但是我只得到了这个错误.
CS0815 Cannot assign method group to an implicitly-typed variable
Run Code Online (Sandbox Code Playgroud)
可以将方法分配给Func<..., TResult>类型变量.我用Func和返回字符串的方法测试,然后我得到了这个:
// Result of
// Func<string> func = new TestClass().TestMethod;
// func.GetType();
Instance TestClass -> TestMethod Type : System.Func`1[System.String]
Run Code Online (Sandbox Code Playgroud)
但它是一个类型名称Func<string>.那么,方法的真正类型名称是什么?
编辑2018年2月10日上午01:46,KST(GMT +09:00)
好吧,让我总结一下.函数本身没有类型,也不是对象,并且Delegate/ Func<>是.NET Framework的一个功能,它将函数作为一等公民处理(但它不是FCC).这是对的吗?