C# 为什么基类上的类型约束不显示默认接口实现?

C# 为什么基类上的类型约束不显示默认接口实现?,c#,c#-8.0,C#,C# 8.0,在C#8.0中,引入了默认接口实现。 现在您可以编写这样的接口 interface IFoo{ void DoDefaultThing(){ // Do some default stuff here } void DoSomethingElse(); } 类实现了它 public Foo: IFoo{ public void DoSomethingElse(){ // Implementation } } 目前,我在Foo public void Us

在C#8.0中,引入了默认接口实现。 现在您可以编写这样的接口

interface IFoo{
   void DoDefaultThing(){
   // Do some default stuff here
   }

   void DoSomethingElse();
}
类实现了它

public Foo: IFoo{
  public void DoSomethingElse(){
  // Implementation
  }
}
目前,我在
Foo

public void UseFoo<T>(T foo) where T:Foo{
  foo.DoSomethingElse();//Valid
  foo.DoDefaultThing();//Compiler error
}
public void UseFoo(T foo)其中T:foo{
foo.DoSomethingElse();//有效
foo.DoDefaultThing();//编译器错误
}
我可以通过添加接口约束来解决这个限制

public void UseFoo<T>(T foo) where T:Foo,IFoo{
  foo.DoSomethingElse();//Valid
  foo.DoDefaultThing();//Now Valid
}
public void UseFoo(T foo)其中T:foo,IFoo{
foo.DoSomethingElse();//有效
foo.DoDefaultThing();//现在有效
}

这是编译器的限制吗?

不,这是正确的。默认接口实现不是
Foo
的方法;它只能通过
IFoo
引用访问。这不是泛型所特有的。您不需要使约束更加复杂<代码>((IFoo)foo).DoDefaultThing()将起作用。我的印象是,默认接口实现是一种向类型引入新方法的方式,而不会像扩展方法那样引入破坏性更改。我现在明白了为什么它会这样。不,这是正确的。默认接口实现不是
Foo
的方法;它只能通过
IFoo
引用访问。这不是泛型所特有的。您不需要使约束更加复杂<代码>((IFoo)foo).DoDefaultThing()将起作用。我的印象是,默认接口实现是一种向类型引入新方法的方式,而不会像扩展方法那样引入破坏性更改。我现在明白了为什么它会这样。