你必須記住Genrics在C#中的工作方式,編譯器會創建一個指定類型的類,並且因此你有錯誤。
爲了解釋更多,因爲下面的例子:
public class InterfaceImplementation : IObject
{
}
,然後一些,你這樣做:
var genericInitialisation = new Holder<InterfaceImplementation>();
在編譯時,編譯器會創建一個類HolderInterfaceImplementation
更換T
的所有accurances泛型參數。
所以編譯後,你將擁有這個類:
public class HolderInterfaceImplementation
{
private ListInterfaceImplementation items;
public void AddItem(InterfaceImplementation item){
items.Add(item);
item.Holder = this;
}
而且item.Holder
將HolderIObject
類型,所以編譯器報告有關無法轉換HolderInterfaceImplementation
到HolderIObject
至極的邏輯錯誤。
public interface IObject<T> where T : IObject<T>
{
double x { get; }
double y { get; }
Holder<T> Holder { get; set; }
}
public class Holder<T> where T : IObject<T>
{
public Holder()
{
items = new List<T>();
}
private List<T> items;
public void AddItem(T item)
{
items.Add(item);
item.Holder = this;
}
}
public class Implementation : IObject<Implementation>
{
public double x
{
get { return 0; }
}
public double y
{
get { return 0; }
}
public Holder<Implementation> Holder
{
get;
set;
}
}
static void Main(string[] args)
{
var t = new Holder<Implementation>();
t.AddItem(new Implementation());
Console.ReadKey();
}
爲什麼不使用公共類持有人:
解釋理論中的方案有天然化,這裏是一個例子後? –
你爲什麼兩次問同樣的問題? –
這不是同一個問題,我在前面的問題上犯了太多錯誤,所以我寫了一個新問題。這也是一個不同的例子。 – amramaz