2011-11-04 38 views
3

鑑於接口這是爲什麼。在實現接口的類中調用interfaceextension方法時需要限定符嗎?

public interface IHaveError 
{ 
    string ErrorMessage { get; set; } 
} 

擴展

public static class HaveErrorExtensions 
{ 
    public static void SetErrorMessage(this IHaveError target, string message) 
    { 
     target.ErrorMessage = message; 
    } 
} 

public class HaveError : IHaveError 
{ 
    public string ErrorMessage { get; set; } 

    public void DoSomething() 
    { 
     this.SetErrorMessage(message); 
    } 
} 

爲什麼需要在調用擴展方法this.?沒有它,這個名字就沒有解決。

回答

4

這是擴展方法在C#語言規範中的工作原理。如果你讀一節「7.6.5.2擴展方法調用」,它基本上是說,你必須有下列形式之一的方法調用:

expr . identifier () 
expr . identifier (args) 
expr . identifier <typeargs> () 
expr . identifier <typeargs> (args) 

如果你注意,expr是一個擴展方法需要搜索是一個選項。

在這種情況下,this.成爲expr.以上,因此上述可以得到翻譯成靜態的方法調用的類型,其中它定義爲一個擴展方法:

C . indentifier (expr , args) 

在你的情況下,爲了爲了讓編譯器「查找」(甚至搜索)方法調用,您需要指定一些「expr」類型。明確的this.合格。它使編譯器藉此:

this.SetErrorMessage(message); 

並搜索與工作類型匹配的擴展方法,它翻譯成:

HaveErrorExtensions.SetErrorMessage(this, message); 
4

擴展方法僅僅是靜態方法,其中包含一些由編譯器應用的語法糖(非常美味的語法糖!)。該方法被稱爲'on'的對象引用實際上是該方法的第一個參數。

編譯器需要知道你的意思是什麼。它無法猜測。

3

因爲this引用了當前正在使用的對象。如果沒有this,編譯器不知道將擴展方法應用於什麼。

相關問題