锯齿状数组 T[][] 到 IEnumerable<T[]>

Jagged array T[][] to IEnumerable<T[]>

我试图理解为什么以下代码中的隐式转换会导致 WhosebugException。我认为这是一个 covariance/contravariance 问题,但我目前无法解释原因。

使 NUnit 崩溃:

private List<T[]> _NodesContent = new List<T[]>();
private UnrolledLinkedListBuilder<T> AddNodes(IEnumerable<T[]> nodes)
{
    _NodesContent.AddRange(nodes);
    return this;
}

public UnrolledLinkedListBuilder<T> AddNodes(params T[][] nodes)
{
    return AddNodes(nodes);
}

作品:

private List<T[]> _NodesContent = new List<T[]>();
private UnrolledLinkedListBuilder<T> AddNodes(IEnumerable<T[]> nodes)
{
    _NodesContent.AddRange(nodes);
    return this;
}

public UnrolledLinkedListBuilder<T> AddNodes(params T[][] nodes)
{
    return AddNodes((IEnumerable<T[])nodes);
}

我从这个答案中了解到 转换应该隐式执行。 此外,如果在第一个示例中直接从 AddNodes(T[][]) 调用 _NodesContent.AddRange(nodes) 也不会出现异常。

I'm trying to understand why implicit conversion in the following code causes WhosebugException.

嗯,不需要隐式转换。但这不是很明显吗?您的第一个方法会调用自身,因为您按原样传递了参数:

public UnrolledLinkedListBuilder<T> AddNodes(params T[][] nodes)
{
    return AddNodes(nodes);
}

如果在任何情况下都不会导致 WhosebugException,那就是编译器错误:

public SomeReturnType AnyMethod(AnyType x)
{
    return AnyMethod(x); // WhosebugException
}

参数使用 params 并不重要,因为如果不使用 params 就不可能有另一个具有相同参数类型的方法,因为这是不明确的。所以这永远是最佳人选。