2017-09-21 35 views
-2

我試圖編譯源代碼的開源項目,我試圖理解下面的代碼:C#拉姆達接口分配

public interface INotifyPropertyChanged 
{ 
    event PropertyChangedEventHandler PropertyChanged; 
} 

public interface INameValue: INotifyPropertyChanged 
{ 
    string Name { get; set; } 
    string Value { get; set; } 

} 

bool ExistingHeaders(INameValue value) => 
     value.Name.Equals(jsonHeader.Name, StringComparison.InvariantCultureIgnoreCase) 
    && value.Value.Equals(jsonHeader.Value, StringComparison.InvariantCultureIgnoreCase); 

jsonHeader還實現INameValue

從我的理解這會嘗試將「value」創建爲實現INameValue接口的對象,然後將其「Name」和「Value」屬性與jsonHeader中的相應值進行比較。

確實以這種方式實例化一個接口的實例會導致null的Name和Value屬性?

我的理解是否正確?

+1

「ExistingHeaders」聲明在哪裏?這不是拉姆達,而是一種表達方式。它不會創建任何東西,它是一個將'INameValue'作爲參數並檢查這個值的Name是否等於'jsonHeader.Name'並且它的'Value'等於'hsonHeader.Value'的方法。 –

+2

沒有在您分享的代碼中創建「價值」。他們聲明瞭一個方法,它將一個實現了'INameValue'的類的實例作爲參數。你不能實例化一個接口的實例。有沒有這樣的事情作爲一個接口的實例。你可以創建一個*實現接口的類的實例。 –

+0

也許問題是關於=>?這是c#6中引入的表達式方法,我認爲。 – JnJnBoo

回答

3

這...

bool ExistingHeaders(INameValue value) => 
     value.Name.Equals(jsonHeader.Name, StringComparison.InvariantCultureIgnoreCase) 
    && value.Value.Equals(jsonHeader.Value, StringComparison.InvariantCultureIgnoreCase); 

...只是這個較短的變...

bool ExistingHeaders(INameValue value) 
{ 
    return value.Name.Equals(jsonHeader.Name, StringComparison.InvariantCultureIgnoreCase) 
     && value.Value.Equals(jsonHeader.Value, StringComparison.InvariantCultureIgnoreCase); 
} 
+0

謝謝。這爲我澄清。我得到一個「不能在聲明中指定構造函數參數」錯誤在該行。你能建議如何解決這個問題嗎? – Blazanor

+0

@Blazanor錯誤和如何解決這裏解釋:https://docs.microsoft.com/en-us/dotnet/csharp/misc/cs1528 – Michael

1

INameValue值的方法命名ExistingHeaders的參數。通過使用接口作爲參數類型,它允許已經實現INameValue的任何對象作爲參數傳入。

參數在傳遞到方法之前被初始化。該方法沒有實例化任何東西。它只是對作爲參數傳入的對象中的屬性Name和Value進行字符串比較。