MSBuild15 CS0121 неоднозначный 'List<T>.List (параметры T[])' и 'List<T>.List (params List<T>[])'
Следующий код будет компилироваться в MSBuild12, но не будет работать в MSBuild15
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
public class List<T> : IEnumerable<T>
{
private readonly T[] _items;
public List(params T[] items)
{
_items = items;
}
public List(params List<T>[] args)
{
_items = args.SelectMany(t => t).ToArray();
}
public static List<T> New
{
get { return new List<T>(); }
}
public IEnumerator<T> GetEnumerator()
{
foreach (var item in _items)
yield return item;
}
IEnumerator IEnumerable.GetEnumerator()
{
return _items.GetEnumerator();
}
}
}
Результат
CS0121 Вызов неоднозначен между следующими методами или свойствами: 'List.List(params T[])' и 'List.List(params List[])' Пример D:\Example\Test.cs
1 ответ
Решение
Проблема в следующей строке:
public static List<T> New
{
get { return new List<T>(); }
}
и это вызвано, это неоднозначно, какой из двух конструкторов должен использоваться. Вы можете преодолеть это, указав, какой из двух вы хотите использовать, указав соответствующий параметр:
public static List<T> New => new List<T>(new T[]{});
или же
public static List<T> New => new List<T>(new List<T>{});
Другим подходом было бы объявить конструктор без параметров
public List()
{
_items = new T[0];
}
а затем иметь это:
public static List<T> New => new List<T>();