我们最近在代码库中发现了一个问题,其中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);
}
}
Run Code Online (Sandbox Code Playgroud)
Union生成编译错误,指出int []无法转换为ISet。
据我了解,方法解析最初忽略了通用约束。但似乎这段代码会在2019年编译。
我没有在发行说明中看到任何地方,它们指出他们已经解决了该错误或添加了新功能来改善通用方法的方法分辨率。
我正在寻找有关此问题的更多信息,这是Microsoft的错误修复程序还是预期的功能?
它是C#7.3的一部分(因此,如果您指定7.3版,则也可以在VS 2017中使用它)。它记录在C#7.3发行说明中:
改进的过载候选
在每个版本中,过载解决规则都会更新,以解决模棱两可的方法调用具有“明显”选择的情况。此版本添加了三个新规则,以帮助编译器选择显而易见的选择:
- ...
- 当方法组包含某些类型参数不满足其约束的通用方法时,这些成员将从候选集中删除。
- ...
这不是以前的错误-遵守语言规范;我不知道为什么规范最初是按照这里的方式编写的。可能的原因包括:
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |