相关疑难解决方法(0)

接口中的等于方法

据我所知,除了.net中的接口外,所有内容都来自于对象.但是我注意到当我按下"." 在界面名称出现Equals方法之后.当我按F12 for equals方法时,它会指向对象类中的equals方法.如果接口不是从对象类派生的,那么equals方法来自哪里?

c# inheritance interface

6
推荐指数
2
解决办法
923
查看次数

System.Object的BaseType应该与接口相同吗?

  • 摘要

    typeof(ISomeInterface).BaseTypenull; 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处理null0typeof(object)1,使得找到的基类型某种类型的就像找到许多的因素.

    在这种假设下,null可以是任何类型的推导,例如0任意数量的倍数.并且typeof(object)将是任何类的基本类型,就像1是任何数字的因素,甚至本身.实际归国nulltypeof(object).BaseType,但是,打破了这一假设.这似乎说这0是一个因素,1但不是任何其他数字的因素.

    此外,如果我们使用一种方法来SomeType递归地找到基类型,我们不能总是说它SomeType不是一个类,因为它BaseTypenull,typeof(object).BaseType也是null.

    如果这似乎是矛盾的

    typeof(object).BaseType==typeof(object) -> true 
    
    Run Code Online (Sandbox Code Playgroud)

    提出它的基本类型本身,但实际上并不是实体和合同之间的区别?


更新:

我最初说过:

它可能意味着System.Object一个接口,不是吗?

我想说的是它似乎很困惑.这是我表达不好的描述的错,并且很抱歉导致答案集中在那上面.

.net c# reflection types

5
推荐指数
2
解决办法
1447
查看次数

为什么RhinoMocks有义务明确重新定义ToString()以便能够设置它的期望?

我正在尝试模拟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# rhino-mocks mocking

3
推荐指数
1
解决办法
533
查看次数

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

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

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

当然,我试过这个:

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).这是对的吗?

c# types

2
推荐指数
1
解决办法
119
查看次数

标签 统计

c# ×4

types ×2

.net ×1

inheritance ×1

interface ×1

mocking ×1

reflection ×1

rhino-mocks ×1