C# 铸造IList<;T>;对类型为T[]的数组进行原因枚举?

C# 铸造IList<;T>;对类型为T[]的数组进行原因枚举?,c#,.net,arrays,ilist,C#,.net,Arrays,Ilist,我有一个方法,看起来像: T[] field; public Method(IList<T> argument) { this.field = (T[])argument; } T[]字段; 公共方法(IList参数) { this.field=(T[])参数; } 当执行方法体时,是否在强制转换期间进行枚举?如果基础类型不同,这种情况会发生变化吗?不,它不会枚举任何内容。如果参数实际上是一个T[],则它将成功;如果不是,则抛出一个InvalidCastExceptio

我有一个方法,看起来像:

T[] field;

public Method(IList<T> argument)
{
    this.field = (T[])argument;
}
T[]字段;
公共方法(IList参数)
{
this.field=(T[])参数;
}

当执行方法体时,是否在强制转换期间进行枚举?如果基础类型不同,这种情况会发生变化吗?

不,它不会枚举任何内容。如果
参数
实际上是一个
T[]
,则它将成功;如果不是,则抛出一个
InvalidCastException
异常。(或者如果
参数
为null,则返回null。)

如果
参数
是对数组的引用(类型为
T
),则不存在枚举-这是一个简单的强制转换


如果
参数
是对
列表
或实现IList的另一个类的引用,则可能存在强制转换异常。(我说可能是因为可能会有一个隐式或显式转换到
T[]
——很可能不会)


编辑:正如Jon所指出的,在泛型方法中不会进行转换,因此上面的括号是不正确的。

即使转换确实存在,也不会使用它-因为编译器在编译时不知道它。@Jon:我不确定是否遵循-我刚刚用显式转换进行了测试,转换很好。编辑:我把它拿回来(考试中的错误)。你确实是对的。另一方面,你可能希望通过执行field=argument.ToArray()来实现这一点,它将枚举枚举。我们不应该说这可能是一个糟糕的设计吗?调用方能够更改列表,为什么该方法一开始不采用数组?