据我了解,interface
不是像其他类一样从Object
派生的,因此如何允许接口调用ToString()
类的Object
方法。
interface I1
{
}
class D
{
I1 i;
public D()
{
string s = i.ToString(); // why compiler doesn't complain here?
}
}
修改
正如评论中指出的,从对象派生的一切,这是一些矛盾的文章
https://blogs.msdn.microsoft.com/ericlippert/2009/08/06/not-everything-derives-from-object/
答案 0 :(得分:3)
您可以使用T
中的方法,因为Standard ECMA-334
C# Language Specification这样说:
14。表达式
14.3成员查找
14.3.1基本类型
出于成员查找的目的,类型T被认为具有以下基本类型:
[...]
- 如果
T
是 interface-type ,则T
的基本类型是object
的基本接口和类类型ToString()
。
这就是为什么您可以在使用接口作为类型的变量上调用ToString()
的原因,即使在该接口中没有定义spawn
方法也是如此。
答案 1 :(得分:2)
节选:
除了它们可以通过单继承继承的任何类型之外,.NET类型系统中的所有类型隐式地继承自Object或从其派生的类型。对象的通用功能可用于任何类型。
i
必须是实例化类型,因此它可能隐式地(未)装箱到对象,因此.ToString()
可以工作。