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 :(得分:9)
这是var ret = IEnumerable<decimal>();
无效的C#
代码。
您可能希望执行以下操作:
var ret = new List<decimal>();
请记住引用文档的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 :(得分:1)
在SomeOtherKeys
属性getter中,您必须实例化一个实现IEnumerable<decimal>
接口的类。
更改为List<decimal>
会没问题。
var ret = new List<decimal>();
ret.Add(1.0M);
ret.Add(2.0M);
答案 2 :(得分:1)
您创建类实例但从不接口,因为它们只是代码契约,但无法实例化。
您必须选择适合您的方案的实施IEnumerable<T>
的集合并坚持使用它。
您的属性SomeOtherKeys
可以保留签名,无需将其更改为使用接口,因为返回值完全有效,并且有助于减少耦合的良好做法