在属性返回上设置操作IList不起作用

时间:2009-10-06 23:41:07

标签: c#

我有一个界面:

IList<int> CategoryIDs {get;set;}

然后是继承此接口的类:

public IList<int> CategoryIDs
{

     get {}  // this part works
     set { _categoryIDs = value;   // error!

}

访问者的设定部分报告错误:

  

无法将IList<int>类型转换为List<int>

我该怎么办?困惑。

5 个答案:

答案 0 :(得分:2)

IList是一个接口,List是一个具体的类。 List可以实现IList,但也可以实现其他类,因此您无法在没有强制转换的情况下将IList分配给List。尝试这样的事情:

private IList<int> _list = new List();
public IList<int> List
{
    get { return _list; }
    set { _list = value; }
}

当然,你不应该在你的类中编写代码,假设List或_list实际上是一个列表,你应该将它一般地视为IList。

答案 1 :(得分:2)

两件事:

1)将一个setter放在IList<T>成员身上通常是一个坏主意。您通常希望人们在现有列表上工作,但不能完全替换它。这看起来像是:

public interface IMyInterface {
    IList<int> CategoryIDs {get;} // Only put get
}

public class MyClass : IMyInterface
{
     List<int> categoryIDs;

     public IList<int> CategoryIDs
     {
          get { return this.categoryIDs; }
     }
}

2)如果你确实需要这样做,你必须将IList<T>强制转换为List<T>才能进行设置,或者制作副本。

public interface IMyInterface {
    IList<int> CategoryIDs {get;set;} 
}

public class MyClass : IMyInterface
{
     List<int> categoryIDs;

     public IList<int> CategoryIDs
     {
          get { return this.categoryIDs; }
          set
          {
                List<int> asList = value as List<int>;
                if (asList != null)
                    this.categoryIDs = asList;
                else
                    this.categoryIDs = new List<int>(value); // Copy values across into new list!
          }
     }
}

无论哪种方式,这种方法都有点“笨拙”的感觉。

答案 2 :(得分:1)

你可以通过一个小调整来实例化和分配一个List:

private IList<int> _categoryIDs; // use IList instead of List
public IList<int> CategoryIDs
{

     get { return _categoryIDs; }
     set { _categoryIDs = value; }

}

答案 3 :(得分:0)

显然,您的字段_categoryIDs被声明为List<T>,而您的属性为IList<T>(甚至IList,很难说源代码格式设置不完整题)。 IList<T>(和IList)是一个界面; List<T>是实现该接口的类。因此,您可以将List引用分配给IList类型的变量,但反之亦然。

答案 4 :(得分:-1)

您的设置功能缺少第二个括号。