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

В MSBuild 12 этот конструктор используется по умолчанию. Показывает конструктор по умолчанию с именем

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>();
Другие вопросы по тегам