2017-06-30 35 views
0

首先我想說我有一些Java的背景,現在我正在學習C#。返回C#中的「功能接口」#

我有以下接口:

interface IComparer<T> { 
    bool Equals(T a, T b) 
} 

我要實現以下方法:

static IComparer<T> Compare(...) { } 

如果這是Java中,我會簡單地返回lambda表達式實現自定義的方法收到兩個T,並返回一個bool,但這在C#中無效。

有沒有辦法解決這個問題,而無需創建一個新的類實現IComparer?我不想使用實現「Equals」方法的C#庫中的任何東西,我知道它存在,我只是想了解如何從Java返回類似「功能接口」的東西在C#中。

謝謝。

+1

沒有,lambda表達式無法實現在C#中的接口。 [有人建議](https://github.com/dotnet/roslyn/issues/4801)(現在[這裏](https://github.com/dotnet/roslyn/issues/11929)) – Jcl

+0

而且如何這個例子中的代表來玩嗎? @Jcl –

+1

而不是返回一個接口,你會返回一個直接委託(在你的例子中,一個'Func ')......它絕對不一樣,因爲它適用於單一方法(這就是爲什麼你無法返回lambda表達式的接口......如果定義了幾個方法和屬性,會怎麼樣?) – Jcl

回答

1

當然,您可以在System.Collections.Generic.Comparer<T>.Default靜態屬性中找到通用IComparer的構造函數。那時不需要實現你自己的。

+0

我知道有已經實現但因爲我想學習,我需要創造一個自己。這只是一個簡單的例子。 @Artyom –

+0

@TheApprentice好了,你可以[查看源(http://referencesource.microsoft.com/mscorlib/system/collections/generic/comparer.cs.html#ed43f9f1cdba27ec),看看他們是如何做到的,它是不是太複雜。 –

0

我認爲在Java中的「功能接口」的概念完全平行於C#中的委託類型:

public delegate bool IComparer<T>(T a, T b); 

static IComparer<T> Compare<T>() { 
    return (a,b) => a.Equals(b); 
} 

注意Compare<T>不帶任何參數,它不需要任何返回一個IComparer<T>

你可以用它喜歡:

var e = Compare<int>(); 
var ans = e(1,2); // ans is false