Bru*_*eis 20
不,你不能.如果可以,当你打电话时Foo(),哪个代码会首先执行?如果两个版本都在处理(和修改)全局状态,那么了解执行顺序就非常重要.
无论如何,这没有任何意义.所以不,你不能.
作为从这种可能性中产生的不稳定行为的潜在肮脏的一个简单例子,假设你可以,并假设你有以下代码:
public partial class MyClass {
private int count = 0;
public partial void NastyMethod() {
count++;
}
}
public partial class MyClass {
public partial void NastyMethod() {
Console.WriteLine(count);
}
}
Run Code Online (Sandbox Code Playgroud)
当你打电话时NastyMethod(),它会打印什么价值?没意思!
现在另一个奇怪的问题 如何处理参数?并返回值?
public partial class MyClass2 {
public partial bool HasRealSolution(double a, double b, double c) {
var delta = b*b - 4*a*c;
return delta >= 0;
}
}
public partial class MyClass2 {
public partial void HasRealSolution(double a, double b, double c) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,怎么可能对这段代码有所了解?打电话后我们应该考虑哪个回报HasRealSolution(1, 2, 1)?如何为单一方法提供2个不同的,同步的返回值*?我们不处理非确定性有限自动机!
对于那些在这个假设的世界中强加我不存在的部分方法的人来说void,将returns 替换为在某个私有领域设置一个值.效果几乎相同.
*请注意,我在这里所说的不是由两个值组成的单个返回值,例如元组.我在这里谈论两个返回值.(???)
Meh*_*ari 20
这实际上是对@ Bruno的答案的评论,可能与这个问题不完全相关:
不允许部分方法具有多个实现的决定是在语言设计中做出的任意决定.你的论点是一个很好的理由,为什么你可能决定不用你的语言允许这样的东西但是没有真正的技术限制.您可以非常轻松地决定允许多个实现,并让编译器决定实现的执行顺序.实际上,C#规范已经有partial类未定义顺序的情况:
// A.cs:
partial class Program {
static int x = y + 42;
static void Main() {
System.Console.WriteLine("x: {0}; y: {1}", x, y);
}
}
// B.cs:
partial class Program {
static int y = x + 42;
}
Run Code Online (Sandbox Code Playgroud)
根据C#规范v3.0,这是有效的C#,但输出可以是:
x: 42; y: 84
Run Code Online (Sandbox Code Playgroud)
要么
x: 84; y: 42
Run Code Online (Sandbox Code Playgroud)
并允许编译器生成其中任何一个.它甚至不会产生警告.
C#语言需要部分方法来获得void返回类型.部分方法签名最多可以定义一次.同样,实施应该最多定义一次.
不可以.只有部分版本的部分方法可能包含代码.使用实现定义部分方法的多个实现将导致编译器错误.