我知道IList是接口,List是具体类型,但我仍然不知道何时使用每一个.我现在正在做的是如果我不需要使用该接口的Sort或FindAll方法.我对吗?有没有更好的方法来决定何时使用界面或具体类型?
你能用一个很好的C#例子解释Liskov替换原理(SOLID的'L'),以简化的方式涵盖原理的所有方面吗?如果真的有可能.
IEnumerable和之间有什么区别Array?
IList和之间有什么区别List?
这些似乎具有相同的功能.
像这样的问题的答案:List <T>或IList <T>似乎总是同意返回一个接口比返回一个集合的具体实现更好.但我正在努力解决这个问题.实例化接口是不可能的,因此如果您的方法返回一个接口,它实际上仍然返回一个特定的实现.我通过编写两个小方法来尝试一下这个:
public static IList<int> ExposeArrayIList()
{
    return new[] { 1, 2, 3 };
}
public static IList<int> ExposeListIList()
{
    return new List<int> { 1, 2, 3 };
}
并在我的测试程序中使用它们:
static void Main(string[] args)
{
    IList<int> arrayIList = ExposeArrayIList();
    IList<int> listIList = ExposeListIList();
    //Will give a runtime error
    arrayIList.Add(10);
    //Runs perfectly
    listIList.Add(10);
}
在这两种情况下,当我尝试添加新值时,我的编译器没有给我任何错误,但显然IList<T>当我尝试向其添加内容时,将我的数组公开为暴露的方法会产生运行时错误.因此,那些不知道我的方法中发生了什么,并且必须为其添加值的人,被迫首先将我复制IList到a List以便能够添加值而不会有错误.当然,他们可以做一个类型检查,看看他们是否正在处理a List或者a Array,但是如果他们不这样做,并且他们想要将项目添加到集合中,他们别无选择将其复制IList到a List,即使它已经是一个List.数组永远不会暴露为IList?
我的另一个问题是基于相关问题的接受答案(强调我的):
如果您通过其他人将使用的库公开您的类, …
很长一段时间我都对以下内容感到好奇:
int[] array = new int[1];
int iArrayLength = array.Length;    //1
由于数组实现了IList接口,因此允许以下内容:
int iArrayCount = ((IList<int>)array).Count;    //still 1
但:
int iArrayCount = array.Count;  //Compile error. WHY?
int iArrayLength = array.Length;    //This is what we learned at school!
问题:如何IList<T>在不允许在基类上使用数组的情况下实现(特别是int Count { get; }属性IList<T>)?
我有这个代码:
IList<string> stelle = stelleString.Split('-');
if (stelle.Contains("3"))
    stelle.Add("8");
if (stelle.Contains("4"))
    stelle.Add("6");
但似乎IList在.Split()之后有一个固定的大小:System.NotSupportedException:Collection是固定大小的.
我该如何解决这个问题?
这段代码:
int[] myArr = { 1, 2 };
myArr.Add(3);
投掷构建:
错误CS1061:'System.Array'不包含'Add'的定义,并且没有扩展方法'Add'接受类型'System.Array'的第一个参数可以找到(你是否缺少using指令或汇编引用? )
IList接口有Add()方法,但为什么Array没有实现呢?
更新:我从答案中看到它明确地实现了它,好吧,我明白了,谢谢你,我应该更好地坚持这个问题:
为什么Array实际上没有提供 Add(),或者更好,为什么它必须首先实现IList?相反实施的IList,也可能是另一个接口(例如IArray)可能只对数组成员有用的IList-例如IsFixedSize,IsReadOnly,IndexOf()...只是一个想法.
在修复一个项目中的bug时发现有趣的问题
IList<int> a =new List<int>();
var b = new int[2];
b[0] = 1;
b[1] = 2;
a = b;
a.Clear();
此代码在a.Clear()上抛出异常; 我知道如何解决它,但我没有明确得到导致此NotSupported异常的所有步骤.为什么编译器没有抛出编译时错误?
c# ×9
.net ×5
list ×3
arrays ×2
abstraction ×1
collections ×1
fxcop ×1
ilist ×1
interface ×1
liskov-substitution-principle ×1
oop ×1
system.array ×1