声明一个同时支持Void和IEnumerator的函数
本文关键字:Void 支持 IEnumerator 函数 一个 声明 | 更新日期: 2023-09-27 18:27:54
我想知道是否有一种方法可以声明一个支持使用IEnumerator和Void的方法(例如在接口中),而不需要在子类中同时实现这两种方法?
public void Start()
public IEnumerator Start()
这与我的另一个问题有关:在Coroutine完成时等待
我注意到在Unity上下文中,默认的Start()
方法似乎同时允许两者。
您不能这样做,因为这些方法将具有相同的签名,CSC将无法确定应该为每个调用静态绑定哪个方法。例如:
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#编译器将无法静态绑定您的方法调用,并且您的代码将无法编译。
你可以通过重新考虑你的设计来解决你的问题。
简短的回答是否定的。
最接近这一点的方法是使用泛型,但这对void无效,对不起。
public T Start()