2016-08-11 3 views
1

Предположим, что мы имеем PartialClass называется Foo, как это:Почему мы не можем писать частичные функции?

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 

Это Class называется Foo и имеет метод Partial. Мой вопрос: почему это незаконно использовать PartialFunction сек, как это:

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 

?

+1

Это вопрос дизайна языка, поэтому вам придется обратиться к разработчикам языка. Остальные из нас могут только догадываться. –

+2

Сегодня я узнал, что есть такая вещь, частичные методы. Благодаря! ;) –

+0

@JeffBridgman, LOL, приветствуется :) –

ответ

2

Если допустимы значения возврата, компилятор не сможет узнать, как обрабатывать возвращаемые значения. Представьте себе, если частичный метод фактически не реализован. В конце концов, частичный метод не имеет для реализации. Это возможность.

Откуда бы получить возвращаемое значение в этом случае? Что, если вызывающий частичный метод пытался использовать возвращаемое значение, но он никогда не был реализован?

+0

Он может использовать 'default (T)' или 'Nothing' как недостающее возвращаемое значение. –

+0

@JonathanAllen: он мог, но тогда это компилятор, создающий семантическое решение для пользователя. В настоящее время компилятор не позволяет методу с типом возвращаемого значения не иметь оператора возврата во всех кодах. Ваше предложение будет эффективно нарушать это правило. – siride

+0

@JonathanAllen, я согласен. Кроме того, специальный синтаксис может быть разработан для указания возвращаемого значения, если он не реализован. –

1

Вы можете написать частичные функции, вам просто нужно немного изменить синтаксис.

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

Это позволяет компилятору удалить вызов функции, который он не реализовал.

+0

Это Sub, который действует как функция. Это хорошая идея, но обход. Интересно, почему функции не могут быть частичными. Это либо доказуемая причина, либо задокументированное намерение, либо нет конкретной причины. –

+0

@ LajosArpad: есть очень веская причина.Функция возвращает значение, от которого может зависеть другое. Если функция удалена, потому что она никогда не реализована, тогда код, который зависит от нее, остается без изменений. Это не семантически справедливо. Как указывает vcsjones, компилятор может просто ввести значение по умолчанию, но это угадывает намерения пользователя. Это не безопасная замена и не отражается нигде в языке. – siride

+0

@siride, это хороший момент. Интересно, будет ли полезен специальный синтаксис здесь, что было бы обязательным для частичных объявлений функций. –

Смежные вопросы