2016-08-11 12 views
1

は、私たちがこのように、Fooと呼ばれるPartialClassを持っていると仮定してみましょう:なぜ部分関数を書くことができないのですか?

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 

これはFoo呼ばClassあるとPartial方法があります。私の質問は次のとおりです。

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 

:なぜそれがこのようなPartialFunction Sを使用するのは違法でしょうか?

+1

これは言語デザインに関する質問ですので、言語設計者に対処する必要があります。私たちの残りの部分は推測できます。 –

+2

今日、私はそのようなことが部分的な方法があることを知りました。ありがとう! ;) –

+0

@JeffBridgman、LOL、歓迎です:) –

答えて

2

戻り値が許可された場合、コンパイラは戻り値の処理方法を知ることができません。部分的な方法が実際には実装されていないと想像してください。結局のところ、部分的な方法ではにはが実装されていません。それは〜への機会です。

この場合、戻り値はどこから来ますか?部分メソッドの呼び出し側が戻り値を使用しようとしたが実装されていない場合はどうなるでしょうか?

+0

欠落している戻り値として 'default(T)'または 'Nothing'を使うことができます。 –

+0

@JonathanAllen:それは可能ですが、それはコンパイラが意味論的な意思決定を行うことです。コンパイラは現在、戻り値の型を持つメソッドにすべてのコードパスでreturn文を持たせることはできません。あなたの提案はそのルールに効果的に違反します。 – siride

+0

@JonathanAllen、私は同意します。また、実装されていない場合には、戻り値を指定する特殊な構文を設計することもできます。 –

1

部分的な関数を書くことができます。構文をわずかに変更するだけで済みます。

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

これにより、コンパイラは実装されていない関数呼び出しを削除できます。

+0

これは、Subのように機能します。それは良いアイデアですが、回避策です。私は機能が部分的であることが許されない理由について疑問に思います。それは証明可能な原因または文書化された意図であるか、または特別な理由はありません。 –

+0

@ LajosArpad:非常に良い理由があります。関数は値を返します。値は他に依存する可能性があります。関数が実装されていないために関数が削除された場合、それに依存するコードはwith..nothingのままになります。これは意味上有効ではありません。 vcsjonesが指摘しているように、コンパイラはデフォルト値を置くことができますが、それはユーザの意図を推測しています。安全な置換ではなく、言語の他の場所ではミラーリングされません。 – siride

+0

@サイード、それは良い点です。私は、ここでは特別な構文が有用かどうか、部分的な関数宣言のために必須となるかどうか疑問です。 –

関連する問題