2017-08-06 35 views
1

假設有一個身份的功能,那就是:如何解決C#中的N級多態性問題?

T Id<T>(T t) { return t; } 

我應該輸入F

void F<T>(Func<T, T> f) { // This is not sound! 
    System.Console.WriteLine("{0}", f(1)); 
    System.Console.WriteLine("{0}", f("one")); 
} 

static void Main() { 
    F(Id); 
} 

我認爲C#沒有等級n多態性和C#不能鍵入F香甜。這是正確的嗎?

然後如何解決這些問題?

+0

你將需要詳細闡述,很多。確實,您發佈的代碼不起作用。但是你爲什麼要讓它工作?你的「通用」方法只是使用'T'來調用'f'委託。您可以輕鬆地聲明方法'void F(Func f){...}'它可以工作。 –

+0

'void F(Func f){...}'不是類型安全的。如果'F'有這樣的類型,'f'可以是'string Foo(int v){return v +「」; }'。 – kakkun61

+0

這看起來似乎是一個有關C#語言不支持的功能的學術問題。你能給一個實際的用例嗎? – Corey

回答

5

這不是我清楚你想達到什麼樣的,但是你可以使用包含一個通用的方法非泛型接口做到這一點:

using System; 

interface IGenericSameTypeFunction 
{ 
    T Apply<T>(T input); 
} 

public class SimpleIdentityFunction : IGenericSameTypeFunction 
{ 
    public T Apply<T>(T input) => input; 
} 

class Test 
{  
    static void F(IGenericSameTypeFunction function) 
    { 
     Console.WriteLine(function.Apply(1)); 
     Console.WriteLine(function.Apply("one")); 
    } 

    static void Main() 
    { 
     F(new SimpleIdentityFunction()); 
    } 
} 

重要的方面是,通過使Apply方法通用而不是F方法,你會說「這是一個可以以任何類型的類型安全方式應用的函數」。

雖然沒有辦法將該接口表示爲委託類型。