Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 声明一个同时支持Void和IEnumerator的函数_C#_Void_Ienumerator - Fatal编程技术网

C# 声明一个同时支持Void和IEnumerator的函数

C# 声明一个同时支持Void和IEnumerator的函数,c#,void,ienumerator,C#,Void,Ienumerator,我想知道是否有一种方法可以声明一个方法(例如在接口中)来支持IEnumerator和Void的使用,而不需要在子类中同时实现这两种方法 public void Start() public IEnumerator Start() 这与我的另一个问题有关: 我注意到在Unity上下文中,默认的Start()方法似乎同时允许这两种情况。简短的回答是否定的 最接近这一点的方法是使用泛型,但是,抱歉,这在一个空白处是行不通的 public T Start() 简而言之,答案是否定的 最接近这一点的方

我想知道是否有一种方法可以声明一个方法(例如在接口中)来支持IEnumerator和Void的使用,而不需要在子类中同时实现这两种方法

public void Start()
public IEnumerator Start()
这与我的另一个问题有关:


我注意到在Unity上下文中,默认的
Start()
方法似乎同时允许这两种情况。

简短的回答是否定的

最接近这一点的方法是使用泛型,但是,抱歉,这在一个空白处是行不通的

public T Start()

简而言之,答案是否定的

最接近这一点的方法是使用泛型,但是,抱歉,这在一个空白处是行不通的

public T Start()

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

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

您不能这样做,因为这些方法将具有相同的签名,并且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#编译器将无法静态绑定方法调用,代码将无法编译


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

您不能这样做,因为这些方法将具有相同的签名,并且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#编译器将无法静态绑定方法调用,代码将无法编译


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

请不要在标题前加上“C:”之类的前缀。这就是标签的用途。为什么需要“void”版本?只是不使用result是很好的…对不起前缀…我想它会澄清/使我的问题更具体。在我的另一个问题中,我需要一个通用的void函数来调用协同程序,并等待协同程序完成后再继续。请不要在标题前面加上“C#::”之类的前缀。这就是标签的用途。为什么需要“void”版本?只是不使用result是很好的…对不起前缀…我想它会澄清/使我的问题更具体。在我的另一个问题中,我想要一个通用的void函数调用一个协程并等待该协程完成后再继续。我理解编译器在确定哪个函数时的模糊性。我试图避免强制实现接口的类必须编写空函数。我似乎想不出一个通用的重新设计来允许我在引用问题中做我需要做的事情(在IEnumerator函数完成时等待),如果你很好地实现了你的方法,那么在引用程序迭代IEnumerator之前,它不会做任何事情。因此,该方法将与虚空方法一样快。我理解编译器在确定哪个函数时的模糊性。我试图避免强制实现接口的类必须编写空函数。我似乎想不出一个通用的重新设计来允许我在引用问题中做我需要做的事情(在IEnumerator函数完成时等待),如果你很好地实现了你的方法,那么在引用程序迭代IEnumerator之前,它不会做任何事情。因此,该方法将与虚空法一样快。