小编Tyl*_*ing的帖子

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

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

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

SearchRequest有3个构造函数 ; 在这个例子中,只有两个占用4个参数的东西很重要:

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

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

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

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

我已经有两个可以正确编译的解决方法:

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

  2. 将第二个参数命名为(因此必要时也是第3个和第4个参数),如下所示:

    var request = new SearchRequest("", ldapFilter: "", searchScope: SearchScope.Base, attributeList: null);
    
    Run Code Online (Sandbox Code Playgroud)

    对于我的特殊情况,这是有效的,因为两个重载的第二个参数不仅在类型上而且在名称上(ldapFilter与filter)不同.

如果不需要解决方法,那就太好了.

c# overload-resolution assembly-references

6
推荐指数
1
解决办法
427
查看次数