C#不能隐式类型从“T”转换为类型“T”

C#不能隐式类型从“T”转换为类型“T”

问题描述:

我收到错误消息“不能隐式地从类型‘SpecificT’的方法ToViewDocument键入‘The.Right.Namespace.SpecificT’转换。C#不能隐式类型从“T”转换为类型“T”

看来,在这个方法中,我重新定义类型SpecificT

这是方法,让我的烦恼:

public override SpecifiedT 
ToViewDocument<SpecifiedT>(XmlEntity entity, DocKey docKey) 
    { 
     switch (docKey.IdArchive) 
     { 
      case IdArchive.A: 
       return ToAViewData((XmlDocA)entity, docKey) //error at this line; 
      default: 
       return ToBViewData((XmlDocB)entity, docKey) //error at this line; 
     } 
    } 

private SpecifiedT ToAViewData(XmlDocMassima entity, DocKey documentKey) 
    { 
     SpecifiedT result = new SpecifiedT(); 
     //map result on entity result 
     //... 
     return result; 
    } 

该功能覆盖了基类的方法:

public abstract T ToViewDocument<T>(XmlEntity entity, DocKey documentKey) where T : ViewDocumentDto, new(); 

而且SpecifiedT延伸牛逼,所以我不明白为什么编译器不能识别SpecifiedT为T.

+0

包含的类定义是什么样的? –

+0

你想'SpecifiedT'是一个实际的类?或者你打算将它作为一个类型参数吗? –

+0

在'ToViewDocument'' SpecifiedT'是一个类型参数,但是在'ToAViewData'中它似乎是一个具体的类?如果是这样,这将不会起作用,因为它是在调用'ToViewDocument'时选择'SpecifiedT'的客户端,例如'ToViewDocument (entity,docKey)'。 – Lee

的一个子类不能覆盖的通用方法,并指定类型参数。您可以将类型参数添加到包含的类中。然后当你实现这个类时,类型参数将被设置为具体类型。

abstract class Container<T> 
    where T : ViewDocumentDto, new() 
{ 
    public abstract T ToViewDocument(XmlEntity entity, DocKey documentKey); 
} 

class SpecificContainer : Container<SpecificViewDocumentDto> 
{ 
    public override SpecificViewDocumentDto ToViewDocument(XmlEntity entity, DocKey documentKey) 
    { 
    } 
}