.net 为什么可以';我们不能写部分函数吗?

.net 为什么可以';我们不能写部分函数吗?,.net,vb.net,partial-classes,partial-methods,.net,Vb.net,Partial Classes,Partial Methods,让我们假设我们有一个名为Foo的Partial类,如下所示: Partial Public Class Foo Partial Private Sub Bar(lorem As String) End Function Private Sub Bar(lorem As String) 'Do something End Function End Class Partial Public Class Foo Partial Private

让我们假设我们有一个名为
Foo
Partial
类,如下所示:

Partial Public Class Foo
    Partial Private Sub Bar(lorem As String)
    End Function
    Private Sub Bar(lorem As String)
        'Do something
    End Function
End Class
Partial Public Class Foo
    Partial Private Function Bar(lorem As String) As Boolean
    End Sub
    Private Function Bar(lorem As String) As Boolean
       Return lorem.StartsWith("A")
    End Sub
End Class
这是一个名为
Foo
,具有
部分
方法。我的问题是:为什么这样使用
Partial
函数是非法的:

Partial Public Class Foo
    Partial Private Sub Bar(lorem As String)
    End Function
    Private Sub Bar(lorem As String)
        'Do something
    End Function
End Class
Partial Public Class Foo
    Partial Private Function Bar(lorem As String) As Boolean
    End Sub
    Private Function Bar(lorem As String) As Boolean
       Return lorem.StartsWith("A")
    End Sub
End Class

如果允许返回值,编译器将无法知道如何处理返回值。想象一下,如果分部方法没有实际实现。毕竟,分部方法不必有实现。这是一个学习的机会


在这种情况下,返回值从何而来?如果分部方法的调用者试图使用返回值,但从未实现,该怎么办?

您可以编写分部函数,只需稍微更改语法即可

Partial Private Sub Bar(lorem As String, ByRef result As Boolean)

这允许编译器删除未实现的函数调用

这是一个关于语言设计的问题,所以你必须向语言设计师提出。我们其他人只能猜测。今天我了解到有这样一件事,那就是局部方法。谢谢!;)@JeffBridgman,LOL,欢迎:)它可以使用
default(T)
Nothing
作为缺少的返回值。@JonathanAllen:可以,但这是编译器为用户做出的语义决策。编译器当前不允许返回类型为的方法在所有代码路径中都没有返回语句。“你的建议实际上违反了这条规则。”我同意乔纳塔纳伦。此外,如果没有实现,还可以设计一种特殊的语法来指定返回值。我只是说这是可以实现的。“我其实不想让它那样工作。”拉乔萨帕德:但为什么?它解决了什么问题?如果需要这种行为,最好使用带有虚拟/抽象函数的派生类。分部类型和方法是处理生成代码的便利工具,而不是用于行为管理的机制。这是一个Sub,其作用类似于函数。这是一个好主意,但也是一个变通办法。我想知道函数不允许是局部函数的原因。这要么是一个可证明的原因,要么是一个有文件证明的意图,要么就是没有具体的原因。@LajosArpad:有一个很好的理由。函数返回一个值,其他函数可以依赖该值。如果函数因为从未实现而被删除,那么依赖于它的代码将没有任何内容。这在语义上是无效的。正如vcsjones指出的,编译器可以只输入默认值,但这只是猜测用户的意图。这不是一个安全的替代,也不会在语言中的任何其他地方反映出来。@siride,这是一个很好的观点。我想知道一种特殊的语法在这里是否有用,这对于部分函数声明是必需的。