Недавно мы обнаружили проблему в нашей кодовой базе, где скомпилированный код VS2019 в порядке, но VS 2017 не удался.
Я создал метод расширения для Union, который имеет общий ISet в качестве общего ограничения
using System;
using System.Collections.Generic;
using System.Linq;
public static class Extensions
{
public static S Union<S, T>(this S self, IEnumerable<T> other) where S : ISet<T>, new()
{
//For simplicity issues since this is a compilation based question
return default(S);
}
public static void Test()
{
var values = new[] { 1, 2, 3 };
var values1 = new[] { 1, 2, 3, 4 };
values.Union(values1);
}
}
Union генерирует ошибку компиляции, утверждая, что int [] не конвертируется в ISet.
Насколько я понимаю, при разрешении метода изначально игнорировались общие ограничения. Но похоже, что этот код компилируется в 2019 году.
Я не видел нигде в примечаниях к выпуску, в которых говорится, что они исправили эту ошибку или добавили новую функцию для улучшения разрешения методов для универсальных методов.
Я ищу больше информации по этому вопросу,
Было ли это исправлением Microsoft или предполагаемой функцией?