声明一个支持Void和IEnumerator的函数

时间:2012-03-16 05:45:02

标签: c# void ienumerator

我想知道是否有办法声明一个支持使用IEnumerator和Void的方法(例如在一个接口中),而不需要在子类中实现它们?

public void Start()
public IEnumerator Start()

这与我的另一个问题有关: Hold or Wait while Coroutine finishes

我注意到在Unity上下文中,默认的Start()方法似乎允许两者。

3 个答案:

答案 0 :(得分:2)

简短的回答是否定的。

你能得到的最接近的是使用泛型,但对于虚空来说这是行不通的,对不起。

public T Start()

答案 1 :(得分:2)

一个函数名+参数组合只能声明一次,因此只能有一个输出。

答案 2 :(得分:2)

您不能这样做,因为这些方法具有相同的签名,并且CSC无法确定哪个方法应该为每个调用静态绑定。 e.g:

public class TestClass
{
    public int FooMethod()
    {
        return 1;
    }
    public void FooMethod()
    {
        return;
    }
    public string FooMethod()
    {
        return "foo";
    }
}

static void Main()
{
    TestClass test = new TestClass();

    Console.WriteLine(test.FooMethod()); // which FooMethod should be called here?
}

方法的返回类型不被视为其签名的一部分。您可以做的是使用不同的签名重载相同的方法以返回不同的类型。此外,如果其他方法仅在返回void时有所不同,您始终可以选择不使用原始方法返回的结果。

接口的情况类似。当一个类实现一个接口时,它同意一个协议,它实现了该接口的行为,这是你的类的消费者所期望的。所以你不能部分同意接口。虽然您可以在实现中抛出NotImplementedException,但您必须至少定义所有成员,这导致上述示例中提到的相同问题:C#编译器将无法静态绑定您的方法调用,您的代码将无法编译。

您可以通过重新考虑您的设计来解决问题。