在给定以下约束的情况下,是否有可能以某种方式编译X M() { /*...*/ }
:
M
。/*...*/
不包含return
或throw
,您无法对其进行更改。M
周围的所有内容。这似乎是一个荒谬的问题,但它实际上对DSL有价值
例如。我可以定义像task M() {}
这样的东西,它只是表示它是一个任务,并且与返回值无关。
答案 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>();
}