繁体   English   中英

模棱两可的扩展方法

[英]Ambiguous extension method

我正在对扩展方法进行以下调用:

database.ExecuteScalar(command).NoNull<string>(string.Empty);

我收到扩展方法不明确的错误。

我有两个具有相同代码的 dll,它们在不同的命名空间下实现NoNull(string str)

如何明确引用一个名称空间?

如果它是相同的命名空间,我将如何完成它?

更新:我无法重写第 3 方 dll。

  1. 通过在源头重新定义或消除其中一种方法来消除歧义。 你不需要冗余。
  2. 如果您不控制源,请通过using指令在类文件中仅包含其中之一。
  3. 如果您仍然需要给定类文件中的两个命名空间,只需将您想要的版本作为静态类调用来调用,通过(可能是完全限定的)类名明确标识该方法。
 Abc.Xyz.ExtensionsClass.NoNull(database.ExecuteScalar(), string.Empty);
 // <Abc.Xyz.> is only necessary if the classes themselves match names
 // if not, only <ClassName>.<MethodName> is needed

以防万一有人需要这个......

如果具有相同名称的扩展方法的并发命名空间包含在不同级别(大多数内部包含的命名空间将具有优先权),则可以解决歧义。

例如:

using Namespace1;
namespace MyApplication 
{
    using Namespace2;
    ...
    db.Execute(); // Namespace2 Execute() will be called
}

强烈建议您重命名其中一种扩展方法。 根据您所做的其他事情,您可能只需删除这些名称空间之一的using指令,但如果您需要两个名称空间来做其他事情,那将无济于事。 (当然,这导致建议将扩展方法放在它们自己的命名空间中。)不过,重命名可能会简化一般的事情。

在我的例子中,问题是,这两种扩展方法都具有相同的名称空间,如Some.Namespace.Extensions ,我无法控制,因此无法更改。

不过,它们各自位于一个单独的 class 中。 所以我通过using static Some.Namespace.Extensions.HostExtensions而不是using Some.Namespace.Extensions来解决它,因为使用带有 static class 的using语句是不可能的。

您应该更改一个(或两个)的签名以区分它的作用。 这似乎是某处的代码重复,除非它们做不同的事情。 虽然如果他们做不同的事情,我认为你会在名称中区分它们。 我建议创建某种枚举(可能是一个标志)作为一个额外的参数传递给其中一个方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM