我有一个界面:
IList<int> CategoryIDs {get;set;}
然后是继承此接口的类:
public IList<int> CategoryIDs
{
get {} // this part works
set { _categoryIDs = value; // error!
}
访问者的设定部分报告错误:
无法将
IList<int>
类型转换为List<int>
。
我该怎么办?困惑。
答案 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)
您的设置功能缺少第二个括号。