2017-05-25 68 views
0

被用作类型参数“T”我有以下类类型“XXX”不能在通用类型或方法

public interface IHtmlString 
{ 
    string ToHtmlString(); 
} 

public class BaseClass<T> where T : BaseClass<T>, IHtmlString 
{ 
    public BaseClass() 
    { 
    } 
    public T Method1() 
    { 
     return (T)this; 
    } 
    public T Method2(string key, object value) 
    { 
     return (T)this; 
    } 
    public string ToHtmlString() 
    { 
     return ToString(); 
    } 
} 

public class DerivedClassA : BaseClass<DerivedClassA> 
{ 
    public DerivedClassA MethodSpecificToClassA() 
    { 
     return this; 
    } 
    public override string ToString() 
    { 
     return "<div/>";    
    } 
} 

public class DerivedClassB : BaseClass<DerivedClassB> 
{ 
    public DerivedClassB MethodSpecificToClassB() 
    { 
     return this; 
    } 
    public override string ToString() 
    { 
     return "<span/>"; 
    } 
} 

注意,该方法返回this实例,这样我可以链的方法,如下面

var a = new DerivedClassA() 
     .Method1() 
     .MethodSpecificToClassA() 
     .ToHtmlString(); 

然而即时得到编译时错误

严重性代码说明项目文件李ne抑制状态 错误CS0311类型'DerivedClassA'不能为 ,用作通用类型或方法 'BaseClass'中的类型参数'T'。没有从 'DerivedClassA'到 'System.Web.IHtmlString'的隐式引用转换。 WebApplication5 C:\ MyProjects下\ WebApplication5 \ WebApplication5 \型号\ BaseBuilder.cs 27主动

我如何重构这些类,所以我有只基类IHtmlString接口?

回答

1

我认为你在where子句中创建了一个无限循环,说t必须从另一个通用版本本身循环。你可以只说其中T:IHtmlString,它应该工作

1

这个工作

public class BaseClass<T> : IHtmlString where T : BaseClass<T> 
{ 
} 
相关问题