2016-12-08 17 views
4

我嘗試更改方括號運算符的行爲。 現在我的問題是,如果甚至有可能做到這一點。重寫字符串的方括號運算符?

我知道我可以創建一個字符串的擴展方法有這樣的事情:

public static class StringExtension 
{ 
    public static char Substring(this string value, int position) 
    { 
     //do something 
    } 
} 

但我怎麼可以重寫括號操作? 這是行不通的:

public static class StringExtension 
{ 
    public static char this[this string value, int position] 
    { 
     //do something 
    } 
} 

怎麼可以做到。或者甚至有可能?

+0

不,那是不可能的。您不能在靜態類中聲明索引器,並且索引器不能是靜態的。 – Shreevardhan

+0

有一個名爲「Extension Everything」的提案 - https://github.com/dotnet/roslyn/issues/11159。但是截至目前,還不可能爲索引器編寫擴展方法。 – Evk

+1

你想實現什麼?沒有什麼像c#中的「方括號運算符」。它是一個(保留)符號(如括號和花括號也是)。堅持你的例子和其他評論:索引一個字符串已經是可能的:'var c =「hello world」[0];'產生'char'類型的'h'。 –

回答

2

讓我們一次處理幾個概念。

The square bracket operators被用於索引到聚合對象:在對象上

  • 陣列
  • 索引性能此外他們用來表示屬性,但這是不相關的這個答案。

    現在,字符串不是數組,因此字符串對象具有this[...]屬性。

    您的問題:「我如何覆蓋方括號的操作符?」有這樣的回答:簡單地說,你重寫像任何其他財產,提供,你可以:

    1. 從宣佈它
    2. 覆蓋它,因爲它是虛擬的
    3. 實際獲得的效果類型繼承因爲你可以有構造對象,而不是原來的基本類型

    對於字符串時,代碼使用新的後裔類型,標準都是一個不走此:

    1. 不能從字符串繼承,它是一種密封式,幷包含了性能方面的考慮
    2. 由於式密封主要是外部代碼,存在有虛擬的成員沒有任何意義
    3. 你可以用」在代碼的大量swatch中構造字符串時,不要使用System.String類型。

    因此覆蓋這是否爲字符串?不,不能做到。

    然後你展示了一個例子,你想出了什麼,它類似於擴展方法的語法。

    在繼續之前回顧一下:

    • 覆蓋的東西,我們講繼承和多態(虛成員在基類)
    • 擴展方法擴展東西可以提供現有類型的額外方法而無需修改所述類型

    是的,你可以肯定地將擴展方法添加到字符串,但你不能提供擴展屬性(還)

    新的Roslyn編譯器項目有很多功能建議,包括Extension Everything功能,可能可以解決這個問題。但是,它尚未決定,也未計劃或實施。

    您可以創建一個正常的擴展方法,但您不能重新定義,覆蓋或擴展[...]運算符的操作。

    public static class StringExtension 
    { 
        public static char CharAt(this string value, int position) 
        { 
         //do something 
        } 
    } 
    

    用法:

    string s = "Test"; 
    char c = s.CharAt(2);