从实现者调用接口扩展方法在C#中很奇怪

调用在实现者的接口上工作的扩展方法似乎需要使用this关键字.这看起来很奇怪.

有谁知道为什么?

有没有更简单的方法来获得接口的共享实现?

当我遭受多重继承/混合撤销时,这让我感到烦恼.

玩具示例:

public interface ITest
{
    List<string> TestList { get; }
}

public static class TestExtensions
{
    private const string Old = "Old";
    private const string New = "New";

    public static void ManipulateTestList(this ITest test)
    {
        for (int i = 0; i < test.TestList.Count; i++)
        {
            test.TestList[i] = test.TestList[i].Replace(Old,New);
        }
    }
}

public class Tester : ITest
{
    private List<string> testList = new List<string>();
    public List<string> TestList
    {
        get { return testList; }
    }

    public Tester()
    {
        testList.Add("OldOne");
        testList.Add("OldTwo");

        // Doesn't work
        // ManipulateTestList();

        // Works
        this.ManipulateTestList();
    } 
}

解决方法

我直接向语言小组提出了这个确切的问题.我没有电子邮件,但基本上答案(来自Mads,IIRC)是:它是:

>减少搜索空间/复杂性 – 即不必考虑所有可用的扩展方法(并修剪它们),除非首先有表达式.
>以减少扩展方法意外地“接管”常规方法(即,更好地匹配)的机会

就个人而言,我希望它能够始终如一地工作 – 第一个似乎不是一个大问题(但后来,我不编写编译器),也没有接近通常这个.*是可选的事实(可能有影响,如当地的代码风格指导,即“你应该使用它.”).

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...