簡體   English   中英

C#4.0默認參數

[英]C# 4.0 Default Parameters

考慮以下控制台應用程序:

class Program
{
    static void Main()
    {
        MyInterface test = new MyClass();
        test.MyMethod();

        Console.ReadKey();
    }
}

interface MyInterface
{
    void MyMethod(string myString = "I am the default value on the interface");
}

class MyClass : MyInterface
{
    public void MyMethod(string myString = "I am the default value set on the implementing class")
    {
        Console.WriteLine(myString);
    }
}

該程序的輸出是:

I am the default value on the interface

(1)為什么沒有在沒有提供值的情況下在接口上指定參數為可選的方法。 我認為默認值是實現細節。 如果我們以pre-optional參數樣式編寫此代碼,我們將在接口中創建兩個重載,並在實現類中指定默認值。 即我們會:

interface MyInterface
{
    void MyMethod();

    void MyMethod(string myString);
}

class MyClass : MyInterface
{
    public void MyMethod()
    {
        MyMethod("I am the default value set on the implementing class");
    }

    public void MyMethod(string myString)
    {
        Console.WriteLine(myString);
    }
}

哪個輸出正如我們所料,

I am the default value set on the implementing class

(2)為什么我們不能覆蓋實現類中的默認值!

.Net中的默認值實際上是基於編譯器的語法糖。 在調用站點,編譯器會為您添加默認值。 它無法在編譯時知道對象的運行時類型,因此必須插入接口中定義的值。

因此,它們不能在實現中被“覆蓋”,因為沒有什么可以覆蓋。

Eric Lippert撰寫了一系列關於可選參數主題的非常有趣的博客文章,其中第一篇可以在這里找到。

更新
根據您的評論,您建議的是某種形式的“虛擬”參數(運行時類型聲明),CLR必須“知道”。 我猜這個實現被排除了,因為成本(設計,記錄,實施,測試等)與它給出的好處相比太高了(雖然這只是猜測!)。 或者,有默認的委托方法選項,即:

void M(bool y = false) { ... whatever ... }

由編譯器重寫為:

void M() { M(false); }
void M(bool y) { ... whatever ... }

但是,一旦考慮了多個可選參數和命名參數,那么沿着這條路線導致潛在的不可接受的重載級別。

1)你的想法存在缺陷。 您說默認值是實現細節。 接口沒有實現細節。 通過該邏輯,指定默認值實際上不屬於接口。

只需使用重載方法編寫接口。 定義不僅更清晰,而且在與其他語言連接時界面將更兼容,並且您不會遇到可選參數帶來的版本問題。

2)因為界面定義了操作合同。 接口說默認必須是某種東西......因此類必須以這種方式實現它。

暫無
暫無

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

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