首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中,为什么我不能从接口签名具有基接口类型作为返回类型的函数返回派生接口类型?

在C#中,为什么我不能从接口签名具有基接口类型作为返回类型的函数返回派生接口类型?
EN

Stack Overflow用户
提问于 2021-05-21 05:01:03
回答 2查看 81关注 0票数 0

我收到编译错误:错误CS0535 'COITemplateWriter‘没有为以下代码实现接口成员'iTemplateWriter.Write(iTemplateModel)’TemplateService:

代码语言:javascript
运行
复制
    public COITemplate Write(COITemplateModel model)
    {
        throw new NotImplementedException();
    }

上述方法的接口签名如下:

代码语言:javascript
运行
复制
public interface iTemplateWriter
{
    public iTemplate Write(iTemplateModel model);
}

类型COITemplate实现iTemplate接口,类型COITemplateModel实现iTemplateModel接口,那么为什么这段代码会失败呢?如果接口需要方法返回实现iTemplate的任何内容并将实现iTemplateModel的任何内容作为参数进行编译,这不是很合理吗?

EN

回答 2

Stack Overflow用户

发布于 2021-05-21 05:24:11

你混淆了运行时允许你做的事情和编译器在编译时需要知道的事情。

这就是泛型在C#中的作用

看起来您想要一个接口iTemplateWriter,在该接口上,您希望能够使用此方法Write,该方法可以接受任何iTemplateModel并返回任何iTemplate

您可以通过两种方式完成此操作:

方法1-您可以在接口级别定义接口的实现者将使用哪种类型的iTemplateModel和哪种类型的iTemplate

代码语言:javascript
运行
复制
    public interface iTemplateWriter<TTemplate, TTemplateModel> 
        where TTemplate : iTemplate
        where TTemplateModel : iTemplateModel
    {
         TTemplate Write(TTemplateModel model);
    }

这样做将允许您定义使用COITemplateCOITemplateModelCOITemplateWritter

代码语言:javascript
运行
复制
public class COITemplateWritter : iTemplateWriter<COITemplate, COITemplateModel>
{
    public COITemplate Write(COITemplateModel model)
    {
        throw new System.NotImplementedException();
    }
}

如果您在编译时知道实现类需要使用的类类型,请使用方法1

如果您需要实现类在运行时处理所有类型,并且您不知道编译时的类型,则使用方法2:

方法2-您可以在方法级别定义该方法将使用哪种类型的iTemplate和哪种类型的iTemplateModel。这将要求所有实现类能够返回在运行时传入的任何类型,这允许更多的灵活性,但在编译时结构化较少。

代码语言:javascript
运行
复制
public interface iTemplateWriter
{
    TTemplate Write<TTemplate, TTemplateModel>(TTemplateModel model)
        where TTemplate : iTemplate
        where TTemplateModel : iTemplateModel;
}

public class COITemplateWritter : iTemplateWriter
{
    public TTemplate Write<TTemplate, TTemplateModel>(TTemplateModel model)
        where TTemplate : iTemplate
        where TTemplateModel : iTemplateModel
    {
        
        throw new System.NotImplementedException();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-05-21 05:09:50

如果没有看到COITemplate的其余部分,假设它不是一个接口,那么您应该只需要让函数返回接口类型本身。

代码语言:javascript
运行
复制
public iTemplateWriter Write(COITemplateModel model)
{
   // if the "COITemplateModel" class is an iTemplateWriter you could just return that back.
   return model;

   // OR if some other object you are working with is that interface.
   return (iTemplateWrite)OfWhateverClassYouAreTrying;

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67627878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档