2013-06-03 63 views
2

爲什麼我不能將默認參數值賦予擴展方法的this參數?C#擴展方法中「this」參數的默認值

public static User CheckLogin(this User user = null) 
{ 
    ... 
} 

錯誤108無法爲「這個」參數

指定一個默認值,但是,當我寫類似下面,編譯成功。

public static User CheckLogin([DefaultValue(null)]this User user) 
{ 
    ... 
} 

任何人都可以解釋爲什麼MS限制第一種默認參數分配,同時允許第二個?

+9

我想說的擴展方法需要與一個對象的實例相關聯,因此默認的'this'似乎沒有任何意義。爲什麼你想要一個默認的'this'? – Bazzz

+0

@Bazzz我只是想知道爲什麼VS沒有顯示任何編譯錯誤。我知道它不能用null來調用。 –

+1

@SenJacob實際上,你可以調用一個擴展方法將一個空項目,因爲編譯器將其更改爲靜態方法調用。 '用戶u = null; u.CheckLogin();'。我傾向於在我的擴展方法中檢查'this'以避免使用clagers。 –

回答

7

這些都不是可比較的概念。第一種是編譯器支持可選參數,第二種是設計工具(它沒有直接編譯器對代碼中調用方法的支持)的元數據默認值。對於擴展方法的this參數有一個默認值是無意義的,因爲該值將從調用目標派生。

我最好的猜測,爲什麼他們不支持this在擴展方法中的可選參數是有限的回報(實現成本vs開發者收益)以及編碼風格的混亂。擴展方法在現有類型中將它們自己定義爲假的額外方法,因此this已很好地固定到您正在擴展的類型。想要改變this就等於想改變擴展方法提供的風格,所以你可以不使用它們。

如果你希望它是可選的,不使用擴展方法,使用靜態方法來代替:

public static User CheckLogin(User user = null) 
{ 
    // etc 
} 

然後調用「老」的方式:

var user = UserUtils.CheckLogin(/* optional user here */);