C#窒息

delegate void Bar<T>(T t);

void foo(Bar bar)
{
    bar.Invoke("hello");
    bar.Invoke(42);
}

解决方法是使用界面
interface Bar
{
    void Invoke<T>(T t);
}

但是现在我需要竭尽全力定义接口(interface)的实现。我可以使用委托(delegate)和简单方法实现相同的目的吗?

最佳答案

这是不可能的,因为您不能将开放的通用方法分配给委托(delegate)。建议使用这将是一个有趣的新功能,但目前C#不允许使用。

可能的解决方法:


delegate void Bar(object t);

void foo(Bar bar)
{
    bar.Invoke("hello");
    bar.Invoke(42);
}

void BarMethod(object t)
{
    if (t is int)
        // ...
    else if (t is string)
        // ...
}

foo(BarMethod);


delegate void Bar<T>(T t);

void foo(Bar<string> stringBar, Bar<int> intBar)
{
    stringBar.Invoke("hello");
    intBar.Invoke(42);
}

void BarMethod<T>(T t)
{
    // ...
}

foo(BarMethod<string>, BarMethod<int>);



您已经提到的接口(interface)解决方法:
interface IBar
{
    void Invoke<T>(T t);
}

void foo(IBar bar)
{
    bar.Invoke("hello");
    bar.Invoke(42);
}

class BarType : IBar
{
    public void Invoke<T>(T t)
    {
        // ...
    }
}

foo(new BarType());

关于c# - 多态代表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3868110/

10-10 20:42