是否可以编译具有非void返回类型的C#方法,但不返回值?

时间:2014-07-03 14:43:42

标签: c# syntax dsl

在给定以下约束的情况下,是否有可能以某种方式编译X M() { /*...*/ }

  1. 您无法将任何其他修饰符添加到M
  2. /*...*/不包含returnthrow,您无法对其进行更改。
  3. 您无法将重写器添加到编译器管道中。
  4. 您可以更改M周围的所有内容。
  5. 这似乎是一个荒谬的问题,但它实际上对DSL有价值 例如。我可以定义像task M() {}这样的东西,它只是表示它是一个任务,并且与返回值无关。

3 个答案:

答案 0 :(得分:2)

添加C#规范中的一些其他信息。

第一段声明方法必须具有返回类型或void。

  

方法有一个(可能是空的)参数列表,它表示传递给方法的值或变量引用,以及一个返回类型,它指定方法计算和返回的值的类型。如果方法的返回类型没有返回值,则返回类型为空。

第二段指定具有非void返回类型的方法必须具有可计算的返回表达式。

  

方法可以使用return语句将控制权返回给其调用者。在返回void的方法中,return语句不能指定表达式。在返回非void的方法中,return语句必须包含一个计算返回值的表达式。

尽管规范没有明确声明该方法必须包含一个return语句,但我相信它隐含地这样说。

所以不,根据C#规范是不可能的。

答案 1 :(得分:1)

所以你有一个方法:

public Foo Bar()
{
    DoX();

    DoY();

    DoZ();
}

哪个不编译,因为该方法中唯一的路径不会返回任何内容。

鉴于你的约束(基本上:你必须按原样编译代码,使用标准的C#编译器),答案是:不,你不能进行编译。

答案 2 :(得分:0)

也许,

abstract class Whatever
{
    public abstract X M<X>();
}