Являются ли делегаты Vb.net строго типизированными / Почему компилятор принимает этот «свободно типизированный» делегат? - PullRequest
4 голосов
/ 14 декабря 2011

Я изучаю делегатов в VB.NET и запутался в типах делегатов. Читая о делегатах, я узнал, что делегаты - это тип данных, который может ссылаться на метод с определенным типом подписи. Таким же образом, как строка может ссылаться на символы, делегат может ссылаться на метод (например), который принимает целое число в качестве входных данных и возвращает целое число в качестве выходных данных. Но, играя с делегатами, я обнаружил, что это не так. Приведенный ниже код компилируется и выполняется - хотя я не подчиняюсь «печатанию» в моей подписи делегата. Я не совсем понимаю. Я что-то пропустил?

Public Delegate Function myDelegate(ByVal i As Integer) As Integer' int in, rtrn int

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim md As myDelegate  'should be of type int in, rtrn int
    md = New myDelegate(AddressOf squared) 'allows assign to string in, string out
    MsgBox(md("3")) 
End Sub

Private Function squared(ByVal i As String) As String
    Return i * i
End Function

1 Ответ

6 голосов
/ 14 декабря 2011

Да, VB.NET является строго типизированным языком, как и делегаты.Но VB.NET наследует много багажа от более старых версий VB, таких как неявное преобразование значений.Компилятор VB.NET отправляет вызов Microsoft.VisualBasic.Conversions.ToDouble, чтобы "исправить" конфликтующие типы.

Если вы поставите Option Strict On в верхней части вашего файла .vb, вы увидите ошибкиОжидайте.

Параметр Строгий ограничивает неявные преобразования типов данных только расширяющимися преобразованиями.Расширяющиеся преобразования явно не допускают никаких преобразований типов данных, в которых может произойти потеря данных, и любое преобразование между числовыми типами и строками.Дополнительные сведения о расширяющихся конверсиях см. В разделе «Расширяющие конверсии».

Ссылка

...