“接口名称此时无效”

时间:2013-07-02 14:25:17

标签: c# asp.net entity-framework

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>吗?或者我应该如何返回IEnumerableIQueriable数据类型?

3 个答案:

答案 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可以保留签名,无需将其更改为使用接口,因为返回值完全有效,并且有助于减少耦合的良好做法