你必须记住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