对C#和泛型不是很熟悉,因此我可能会缺少一些明显的东西,但是:

鉴于:

public interface IA { }

public interface IB
{  void DoIt( IA x );
}

public class Foo<T> : IB where T : IA
{
    public void DoIt( IA x )
    {  DoIt(x); // Want to call DoIt( T y ) here
    }

    void DoIt( T y )
    {  // Implementation
    }
}


1)为什么void DoIt(T y)方法不能满足接口DoIt所需的IB方法实现?

2)如何从DoIt(T y)内调用DoIt( IA x )

最佳答案

1)因为任何TIA(这是从约束中给出的),但并非每个IA都是T

class A : IA {}
class B : IA {}

var foo_b = new Foo<B>();
var a = new A();

// from the point of IB.DoIt(IA), this is legal;
// from the point of Foo<B>.DoIt(B y), passed argument is not B
foo_b.DoIt(a);


2)如果确定xT,请使用强制转换:

public void DoIt( IA x )
{
    DoIt((T)x);
}


如果x可以是任意值,并且DoIt(T)可以是可选值,请使用as

public void DoIt( IA x )
{
    DoIt(x as T);
}

void DoIt( T y )
{
    if (y == null)
        return;

    // do it
}


否则,您可以抛出异常或考虑其他方法,具体取决于特定的用例。

关于c# - 如何在C#中调用泛型重载方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35909172/

10-10 18:07