簡體   English   中英

在 int 上使用擴展方法

[英]using extension methods on int

我正在閱讀有關擴展方法的信息,並與它們一起玩弄以了解它們是如何工作的,並且我嘗試了以下方法:

namespace clunk {
    public static class oog {
        public static int doubleMe(this int x) {
            return 2 * x;
        }
    }

    class Program {
        static void Main() {
            Console.WriteLine(5.doubleMe());
        }
    }
}

它按預期工作,使用 doubleMe 方法成功擴展 int,打印 10。

接下來,作為一個老 C 家伙,我想知道我是否可以這樣做:

namespace clunk {
    public static class BoolLikeC {
        public static bool operator true(this int i)  { return i != 0; }
        public static bool operator false(this int i) { return i == 0; }
    }

    class Program {
        static void Main() {
            if ( 7 ) {
                Console.WriteLine("7 is so true");
            }
        }
    }
}

我認為如果前者可以工作,那么后者應該可以使在 boolean 上下文中使用的 int 調用 int 上的擴展方法,檢查 7 不等於 0,然后返回 true。 但相反,編譯器甚至不喜歡后面的代碼,並將紅色波浪線放在兩個 this 的下方並顯示“預期類型”。 為什么不應該這樣做?

非常聰明,一個不錯的嘗試,但遺憾的是我們沒有實現“擴展一切” ,只是擴展方法。

我們考慮過實現擴展屬性、擴展運算符、擴展事件、擴展構造函數、擴展接口等等,但它們中的大多數都不足以使其成為 C# 4 或即將發布的 C# 版本。 我們已經為您提到的那種事情設計了一種語法。 我們在擴展屬性上走得更遠; 我們幾乎將擴展屬性添加到 C# 4 中,但最終沒有成功。 悲傷的故事就在這里。

http://blogs.msdn.com/b/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx

所以,長話短說,沒有這樣的功能,但我們會在假設的未來版本的語言中考慮它。

你當然可以在int上創建一個“ ToBool() ”擴展方法,如果你真的喜歡復古的 C 約定,即non-zero-means-true

擴展方法就是這樣——方法。
您不能制作擴展運算符或屬性。

如果有可能,這將導致代碼非常難以閱讀。
如果您不熟悉代碼庫,幾乎不可能弄清楚if (7)的含義。

正如其他人所說,C# 中沒有擴展運算符之類的東西。

您可以獲得的最接近的方法是在自定義“橋”類型上使用隱式轉換運算符,冒着促進許多討厭的錯誤的風險:

// this works
BoolLikeC evil = 7;
if (evil) Console.WriteLine("7 is so true");

// and this works too
if ((BoolLikeC)7) Console.WriteLine("7 is so true");

// but this still won't work, thankfully
if (7) Console.WriteLine("7 is so true");

// and neither will this
if ((bool)7) Console.WriteLine("7 is so true");

// ...

public struct BoolLikeC
{
    private readonly int _value;
    public int Value { get { return _value; } }

    public BoolLikeC(int value)
    {
        _value = value;
    }

    public static implicit operator bool(BoolLikeC x)
    {
        return (x.Value != 0);
    }

    public static implicit operator BoolLikeC(int x)
    {
        return new BoolLikeC(x);
    }
}

不幸的是,您不能通過擴展方法在類型上引入新的運算符或實現對現有運算符的支持。

基本上,你想做的事是做不到的。

引入新運算符的唯一方法是將它們放入其中一種涉及的類型中。 對於二元運算符,您可以將它們放在您自己的類型中,前提是您的類型是兩者之一,對於一元類型,您需要將運算符放在類型本身中。

由於您不能以任何方式擴展int ,因此您不能這樣做。

Console.WriteLine(5.doubleMe());

相當於

Console.WriteLine(oog.doubleMe(5));

鑒於此,您可以看到為什么if ( 7 )不起作用。

擴展方法只不過是語法。

作為旁注,因為它是語法,您可以在null變量上調用擴展方法,因為它轉換為普通方法調用,並且方法可以采用 null 參數。

不幸的是,您不能使用擴展方法來添加運算符,並且 C# 中的隱式類型轉換是作為運算符實現的。

在第一個實例中,您正在編寫一個擴展方法——例如擴展int數據類型的功能。 在第二個代碼集中,您試圖覆蓋 bool 運算符。 這是兩個完全不同的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM