gpt4 book ai didi

C# 4.0 编译时错误,当错误的重载包含未引用的 .NET 组件中定义的参数类型时无法解析重载

转载 作者:太空狗 更新时间:2023-10-29 21:51:34 24 4
gpt4 key购买 nike

<分区>

这是 C# 4.0 控制台程序的简单代码:

using System.DirectoryServices.Protocols;
namespace OverloadTest
{
class Program
{
static void Main(string[] args)
{
var request = new SearchRequest("", "", SearchScope.Base, null);
}
}
}

SearchRequest 有 3 constructors ;对于这个例子,只有接受 4 个参数的两个很重要:

在这两个构造函数之间,它们的第一个、第三个和第四个参数具有相同类型和命名的参数。只有第二个参数不同:string ldapFilterXmlDocument filter

上面的代码显然对我来说是调用构造函数,它的第二个参数声明为:string ldapFilter

但如果此代码所在的项目没有对 System.XML 的引用,则编译会导致以下错误:
The type 'System.Xml .XmlDocument' 在未引用的程序集中定义。您必须添加对程序集 'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 的引用

显然,编译器无法评估要使用哪个重载,因为错误的重载具有由于缺少对声明组件的引用而无法理解的类型的参数。当然,编译器必须找到一个“最佳方法”来匹配我的代码,但是由于我传递的第二个参数是 string 为什么编译器需要费心担心将我的代码与 匹配XmlDocument 过载?或者,由于 System.DirectoryServices.Protocols.SearchRequest 使用 XmlDocument 类型(作为构造函数参数类型);为什么编译器对 XmlDocument 的含义还不够了解,无法确定字符串不是一个字符串,从而无法选择正确的重载?

我已经有两个编译没有错误的解决方法:

  1. 在项目中添加对 System.XML 的引用。

  2. 命名第二个参数(因此也必须命名第三个和第四个参数),如下所示:

    var request = new SearchRequest("", ldapFilter: "", searchScope: SearchScope.Base, attributeList: null);

    对于我的特殊情况,这是可行的,因为两个重载的第二个参数不仅在类型上而且在名称上也不同(ldapFilter 与过滤器)。

不过,如果不需要任何解决方法,那就太好了。

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