2010-10-27 125 views
2

我在c#中有一个泛型接口,并且几乎总是使用它的一种类型。我想为该类型创建一个非通用接口并使用它。非泛型接口作为泛型接口的同义词

比方说,我有以下代码:

public interface IMyGenericList<out T> where T : IItem 
{ 
    IEnumerable<T> GetList(); 
} 

public class MyList<T> : IMyGenericList<T> where T : IItem 
{ 
    public IEnumerable<T> GetList() 
    { 
     return null; 
    } 
} 

它工作得很好。大多数时候,我需要IMyGenericList<IItem>,所以我尝试以下方法:

public interface IMyItemsList : IMyGenericList<IItem> 
{ 
} 

,但我不能让MYLIST实施IMyItemsList出于某种原因。以下代码返回错误

public class MyList<T> : IMyItemsList, IMyGenericList<T> where T : IItem 
{ 
    public IEnumerable<T> GetList() 
    { 
     return null; 
    } 
} 

说的是IEnumerable<IItem> is not implemented

这是为什么/我该怎么办? 谢谢。

好的,多亏了你的回答,我想到了不可能完全按照我最初的想法去做。我将发布关于为什么这是不可能的另一个问题:) 这就是:One function implementing Generic and non-generic interface

+0

您的'GetEnumerator'方法在哪里? – leppie 2010-10-27 09:01:52

+0

我没有实现IEnumerable,我只是返回一个具有该类型的值 – Shaddix 2010-10-27 09:08:00

+0

“大多数时候我需要'IMyGenericList '”。由于您的类型限制,您只能这样做。 – 2010-10-27 12:43:58

回答

2

您具体的例子是行不通的,因为你的类:

public class MyList<T> : IMyItemsList, IMyGenericList<T> where T : IItem 
{ 
    public IEnumerable<T> GetList() 
    { 
    return null; 
    } 
} 

正在努力实现既IEnumerable<IItem> GetList()IEnumerable<T> GetList(),这是两个不同的东西。首先显式地是IItem(按照您的IMyItemsList接口的要求)的可枚举数,第二个是T的可枚举数。

在这种情况下,T的类型为IItem,但不明确IItem。因此在编译时,IEnumerable<IItem> GetList()不是IEnumerable<T> GetList(),所以编译器会正确地抛出一个错误,告诉你没有实现IEnumerable<IItem> GetList()

其他问题你会遇到的,是当有人确实会发生什么:

var list = new MyList<IItem>(); 

编译器将尝试建立一个具体的实施MyList<IItem>这将有IEnumerable<IItem> GetList()两个定义。

我会重新考虑您的设计以评估单数IEnumerable<T> GetList()

另外,只是挑剔我的部分:“enumerable”!=“list”:P

+0

imho,IEnumerable 其中T:IItem总是可以被转换为IEnumerable ,不是吗?我想,这是在.net中协变的原因吗?我同意你的看法,它看起来很丑并且会导致问题有一个单独的显式IEnumerable GetList()实现 – Shaddix 2010-10-29 06:45:45

1

你不能让你的IMyItemsList接口从IMyGenericList<out T>接口继承,如果你想拥有MyList<T>实现两者。但是你可以修改你的IMyItemsList接口定义如下:

public interface IItem 
{ 
} 

public interface IMyItemsList 
{ 
    IEnumerable<IItem> GetList(); 
} 

public interface IMyGenericList<out T> where T : IItem 
{ 
    IEnumerable<T> GetList(); 
} 

public class MyList<T> : IMyGenericList<T>, IMyItemsList 
    where T : IItem 
{ 
    public IEnumerable<T> GetList() 
    { 
     return null; 
    } 

    IEnumerable<IItem> IMyItemsList.GetList() 
    { 
     return this.GetList().Cast<IItem>(); 
    } 
}