gpt4 book ai didi

c# - VS2019 Roslyn编译器通用约束方法解析

转载 作者:行者123 更新时间:2023-12-02 09:07:39 25 4
gpt4 key购买 nike

我们最近在代码库中发现了一个问题,其中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的错误修复程序还是预期的功能?

最佳答案

它是C#7.3的一部分(因此,如果您指定7.3版,则也可以在VS 2017中使用它)。它记录在C# 7.3 release notes中:

Improved overload candidates

In every release, the overload resolution rules get updated to address situations where ambiguous method invocations have an "obvious" choice. This release adds three new rules to help the compiler pick the obvious choice:

  1. ...
  2. When a method group contains some generic methods whose type arguments do not satisfy their constraints, these members are removed from the candidate set.
  3. ...

这不是以前的错误-遵守语言规范;我不知道为什么规范最初是按照这里的方式编写的。可能的原因包括:
  • 预期的实现复杂性
  • 预期的实现性能
  • 预期的有用性-预期以前的行为会比当前的行为更好甚至更好,而无需意识到现实中会在哪里烦人
  • 关于c# - VS2019 Roslyn编译器通用约束方法解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56192446/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com