锯齿状数组 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
就不可能有另一个具有相同参数类型的方法,因为这是不明确的。所以这永远是最佳人选。
我试图理解为什么以下代码中的隐式转换会导致 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
就不可能有另一个具有相同参数类型的方法,因为这是不明确的。所以这永远是最佳人选。