2013-07-02 3 views
1
public IEnumerable<decimal> SomeKeys 
{ 
    get 
    { 
     return dbContext.SomeTable.Select(x=>x.Key); 
    } 
} 

public IEnumerable<decimal> SomeOtherKeys 
{ 
    get 
    { 
     var ret = IEnumerable<decimal>(); // interface name is not 
              // valid as this point 
     // do stuff with ret 
     return ret; 
    } 
} 

С моим текущим кодом я получаю исключение выше.«Имя интерфейса в настоящий момент недействительно»

Должен ли я вернуть List<decimal>? Или как я могу вернуть типы данных IEnumerable или IQueriable?

+0

они интерфейсы, а не на самом деле «типы данных». я думаю, что базовое руководство по интерфейсам сделает эту проблему понятной: c –

ответ

7

Это var ret = IEnumerable<decimal>(); только недействительно C# код, то есть.

Вы можете сделать что-то вроде:

var ret = new List<decimal>(); 

Remeber что List, ссылаясь на документы, производный от IEnumerable<T> тоже.

public class List<T> : IList<T>, ICollection<T>, 
    IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, 
    IEnumerable 

поэтому код, как

public IEnumerable<decimal> SomeOtherKeys 
{ 
    get 
    { 
     var ret = new List<decimal>();           
     // do stuff with ret 
     return ret; 
    } 
} 

вполне допустимо.

1

В вашем получателе SomeOtherKeys вы должны создать экземпляр класса, который реализует интерфейс IEnumerable<decimal>.

Изменение на List<decimal> будет в порядке.

var ret = new List<decimal>(); 
ret.Add(1.0M); 
ret.Add(2.0M); 
1

Вы создаете экземпляры классов, но не интерфейсы, поскольку они являются только кодовыми контрактами, но не могут быть созданы.

Вам необходимо выбрать коллекцию, реализующую IEnumerable<T>, которая лучше подходит для вашего сценария и придерживается его.

Ваше имущество SomeOtherKeys может держать подпись, нет необходимости менять его в использовании интерфейс в качестве возвращаемого значения не является полностью действительным и хорошая практика, как помогает уменьшить соединения

Смежные вопросы