2010-10-27 160 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>(); 
    } 
}