2012-08-10 83 views
0

我的意思是,命名參數似乎是某種方式的簽名:您不能使用任何名稱並僅考慮參數的位置來調用命名方法。但是,我們不能使用相同的簽名和名稱創建兩個方法,但使用不同的參數名稱。命名參數是方法簽名的一部分嗎?如何和爲什麼?

Can interfaces可以強制類的方法使用給定參數的名稱嗎?

使用命名參數:

INT I =函數(NamedArgument:X);

不使用命名參數:

INT I =函數(X);

+0

這個問題很令人困惑。不知道你是什麼*真的*問... – MilkyWayJoe 2012-08-10 16:58:05

+0

對不起,我的英語是有限的。我舉了一些例子。 – Josell 2012-08-10 17:24:35

回答

4

根據唯一性約束,參數名稱不是簽名的一部分。

從部分中的C#4規範的3.6:

的方法的簽名由該方法的名字,類型參數的數目和類型和種類(值,參考,或輸出)它的每個形式參數,從左到右依次考慮。爲了這些目的,在形式參數的類型中發生的方法的任何類型參數不是通過其名稱來標識的,而是通過其在方法的類型參數列表中的序號位置來標識的。方法的簽名特別不包括返回類型,可能爲最右邊參數指定的params修飾符,也不包括可選的類型參數約束。

參數名稱雖然是編譯器「知道」的方法的一部分;它是具有在元數據中傳播的信息,因爲它用於命名參數。

Can interfaces能強制類的方法使用給定的參數名嗎?

號事實上,你可能會導致一些非常混亂代碼:

interface IFoo 
{ 
    public int M(int x, int y); 
} 

public class Foo : IFoo 
{ 
    public int M(int y, int x) 
    { 
     return x - y; 
    } 
} 

... 

Foo foo = new Foo(); 
IFoo ifoo = foo; 
Console.WriteLine(foo.M(x: 10, y: 3)); // Prints 7 
Console.WriteLine(ifoo.M(x: 10, y: 3)); // Prints -7 
+1

哦,我的天啊,你是Jon Skeet!我在讀你的書。謝謝你的答案和它的例子。 – Josell 2012-08-10 17:03:40

+0

@Josell:破解 - 希望第15章(或其中的一個)可能會有所幫助:) – 2012-08-10 17:03:59

相關問題