C# 为什么基类上的类型约束不显示默认接口实现?
在C#8.0中,引入了默认接口实现。 现在您可以编写这样的接口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
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()将起作用。我的印象是,默认接口实现是一种向类型引入新方法的方式,而不会像扩展方法那样引入破坏性更改。我现在明白了为什么它会这样。