类型参数声明必须是标识符而不是类型 [英] Type parameter declaration must be identifier not a type

查看:121
本文介绍了类型参数声明必须是标识符而不是类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public abstract class BaseDocumentLayer:IDocumentLayer 
{
public IDocumentLayer NextLayer {get; set;}

public virtual Document< T, U> ProcessDocument< T,U>(Document< T,U> document){
if(NextLayer!= null)
document = NextLayer.ProcessDocument(document);
退货凭证;
}
}

public override Document< GenericDatabaseDTO,GenericDatabaseConstants.ActionType> ProcessDocument< GenericDatabaseDTO,GenericDatabaseConstants.ActionType>(Document< GenericDatabaseDTO,GenericDatabaseConstants.ActionType> document)
{
return base.ProcessDocument< GenericDatabaseDTO,
}

public static类GenericDatabaseConstants
{
public enum ActionType
{
CreateGeneric,
ReadGeneric,
UpdateGeneric,
DeleteGeneric,
}



$ b $ p
$ b为什么会出现这样的错误:类型参数声明必须是一个不是类型的标识符?





Error1:

  public override Document< GenericDatabaseDTO,GenericDatabaseConstants.ActionType> ProcessDocument(Document< GenericDatabaseDTO,GenericDatabaseConstants.ActionType> document)
{

return base.ProcessDocument(document);

错误1'GenericDocumentLayer2.Document.GenericDatabase.ProcessLayer.ProcessDocument(GenericDocumentLayer2.TypeDefinition .Document)':找不到合适的方法覆盖



我没有改变我的原点BaseLayer.ProcessDocument方法



UPDATE

  public void Add(GenericDatabaseField field){
var dto = new GenericDatabaseDTO ();
dto.Field = field;
dto.Id =test;

var document = new Document< GenericDatabaseDTO,GenericDatabaseConstants.ActionType>(dto,GenericDatabaseConstants.ActionType.CreateGeneric,null);
IDocumentLayer layer = DocumentFactory.CreateDocumentLayers();
//通用ProcessDocument永远不会被称为基本版本
document = layer.ProcessDocument< GenericDatabaseDTO,GenericDatabaseConstants.ActionType>(document);


解决方案

一种特定类型的通用方法。对于C ++的模板,这是可能的,但对于C#的泛型是不可能的。



为了让你的代码能够编译,把它改为:

  public override Document< TDTO,TActionType> ProcessDocument< TDTO,TActionType>(文档< TDTO,TActionType>文档)

将覆盖所有泛型参数的基类型方法。



如果您想为一种类型提供特殊实现,则可以添加非泛型重载和内部调用在特殊处理后的通用版本:

  public Document< GenericDatabaseDTO,GenericDatabaseConstants.ActionType> ProcessDocument(文档< GenericDatabaseDTO,GenericDatabaseConstants.ActionType>文档)
{
//在这里对这个特殊情况进行一些特殊处理...

return base.ProcessDocument(document);

$ / code>

然而,请注意,这将会破坏像这样的多态: / p>

假设上述方法在 Derived 中实现。 派生源自 Base

  GenericDatabaseDTO dto = /*...*/; 
GenericDatabaseConstants.ActionType actionType = /*...*/;

派生的d = new Derived();
基数b = d;

//通过Derived特殊处理调用非通用版本:
d.ProcessDocument(dto,actionType);
//从Base调用通用版本:
b.ProcessDocument(dto,actionType);


public abstract class BaseDocumentLayer : IDocumentLayer
{                                                       
   public IDocumentLayer NextLayer { get;set;}

   public virtual Document<T, U> ProcessDocument<T, U>(Document<T, U> document) {
      if(NextLayer != null)
         document = NextLayer.ProcessDocument(document);
      return document;          
   }
}

public override Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> ProcessDocument<GenericDatabaseDTO, GenericDatabaseConstants.ActionType>(Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> document)
{       
    return base.ProcessDocument<GenericDatabaseDTO, 
}

public static class GenericDatabaseConstants 
{    
    public enum ActionType 
    {                
       CreateGeneric,
       ReadGeneric,
       UpdateGeneric,
       DeleteGeneric,               
    }
}

Why do I get the error: Type paramter declaration must be an identifier not a type?

Error1:

public override Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> ProcessDocument(Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> document)
{   

    return base.ProcessDocument(document);
}

Error 1 'GenericDocumentLayer2.Document.GenericDatabase.ProcessLayer.ProcessDocument(GenericDocumentLayer2.TypeDefinition.Document)': no suitable method found to override

I have not changed my origin BaseLayer.ProcessDocument method

UPDATE

public void Add(GenericDatabaseField field) {
            var dto = new GenericDatabaseDTO();
            dto.Field = field;
            dto.Id = "test";

            var document = new Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType>(dto, GenericDatabaseConstants.ActionType.CreateGeneric, null);
            IDocumentLayer layer = DocumentFactory.CreateDocumentLayers();
                                          // The generic ProcessDocument is never called just the base version
        document = layer.ProcessDocument<GenericDatabaseDTO, GenericDatabaseConstants.ActionType>(document);                
    }

解决方案

You can't override a generic method for a specific type. This is possible with C++'s templates but not with C#'s generics.

To make your code compile, change it to this:

public override Document<TDTO, TActionType> ProcessDocument<TDTO, TActionType>(Document<TDTO, TActionType> document) 

This will compile, but it will override the base type method for all generic arguments.

If you want to provide a special implementation just for one type, you can add a non-generic overload and internally call the generic version after the special handling:

public Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> ProcessDocument(Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> document)  
{
    // some special handling for this special case here...

    return base.ProcessDocument(document);
}

However, please note that this will break in polymorphic scenarios like this one:

Assume the methods above are implemented in Derived. Derived is derived from Base

GenericDatabaseDTO dto = /*...*/;
GenericDatabaseConstants.ActionType actionType = /*...*/;

Derived d = new Derived();
Base b = d;

// calls the non-generic version with special handling from Derived:
d.ProcessDocument(dto, actionType);
// calls the generic version from Base:
b.ProcessDocument(dto, actionType);

这篇关于类型参数声明必须是标识符而不是类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆