代码之家  ›  专栏  ›  技术社区  ›  LukeN

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

  •  6
  • LukeN  · 技术社区  · 16 年前

    从实现者调用在接口上工作的扩展方法似乎需要使用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();
        } 
    }
    
    3 回复  |  直到 16 年前
        1
  •  4
  •   Marc Gravell    16 年前

    我直接向语言小组问了这个问题。我手头没有这封电子邮件,但基本上(来自Mads,IIRC)的答案是:

    • 减少搜索空间/复杂性-即不必 考虑 所有可用的扩展方法(并删减它们),除非首先有表达式。

    就我个人而言,我希望它能始终如一地工作——第一个问题似乎不是什么大问题(但我不写编译器),而且 接近正常情况下 this.* 是一个可选的东西(可能会有一些影响,比如本地代码样式的指南,即“you shall use this. ").

        2
  •  3
  •   Timwi    16 年前

    语言规范中的相关部分说:

    7.6.5.2扩展方法调用

    在方法调用(§7.5.5.1)中 其中一种形式

    • 出口 . 标识符 ( )
    • 出口 标识符 参数
    • . 标识符 < 类型参数 > (
    • 出口 . < 类型参数 > ( )

    调用找不到适用的 作为扩展方法的构造 出口 或者任何 dynamic ,

    这清楚地表明,扩展方法只能在表达式上调用( 出口 ). 当然,这个表达式可以是 this

        3
  •  1
  •   Preet Sangha    16 年前

    扩展方法是一种编译器技巧,用于将调用重定向到另一个静态类中的静态方法的对象这个。是编译器传递静态方法的对象。不起作用的示例只是编译器告诉您方法不存在,实例方法的作用域是类。