2017-05-25 34 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> 
{ 
} 
相關問題