2010-01-08 3 views
4

У меня следующий код компилируется без проблем. Конечно, я получаю недопустимое исключение литых при выполнении Dim C As IDoThingsC = GetThing_C(). Я что-то упускаю? Вы когда-нибудь захотите вернуть объект, который не соответствует требованию интерфейса для возвращаемого значения функции?Почему интерфейсы не сильно типизированы?

Public Class ClassA 

    Public Sub DoThings_A() 
    Debug.Print("Doing A things...") 
    End Sub 

End Class 


Public Class ClassB 
    Implements IDoThingsC 

    Public Sub DoThings_B() 
    Debug.Print("Doing B things...") 
    End Sub 

    Public Sub DoThings_C() Implements IDoThingsC.DoThings_C 
    Debug.Print("Doing C things...") 
    End Sub 

End Class 


Public Interface IDoThingsC 

    Sub DoThings_C() 

End Interface 


Public Class aTest 

    Public Sub Test() 

    Dim C As IDoThingsC = GetThing_C() 
    C.DoThings_C() 

    End Sub 


    Public Function GetThing_C() As IDoThingsC 

    Dim Thing As ClassA = New ClassA 
    Thing.DoThings_A() 

    Return Thing 

    End Function 


End Class 
+0

Я не вижу, как это скомпилировано? Я что-то упускаю? –

+0

Это * действительно * компилируется без проблем? Я бы подумал, что «GetThing_C» не будет компилироваться, поскольку он пытается вернуть экземпляр ClassA в качестве интерфейса IDoThingsC, который он не реализует. –

+0

Вот что я подумал. Он компилируется в Visual Studio 2005 и в Visual Studio 2010 Beta 2. – JRS

ответ

13

Использование Option Strict On в верхней части файла исходного кода, чтобы поймать проблемы, как это. Вы получите ошибку компиляции времени вместо ошибки во время выполнения:

error BC30512: Option Strict On disallows implicit conversions from 'ClassA' to 'IDoThingsC'. 
+5

+1 для опции Strict. – Will

+6

Является ли это * еще возможным писать код VB в этом оптимистичном способе «с готовностью»? Почему это уже не было удалено? –

+2

Конечно. Еще лучше - я изменил опцию Option Strict в параметрах компиляции проекта (таким образом, я не должен добавлять его ко всем модулям кода). – JRS

1

Взятые из http://msdn.microsoft.com/en-us/library/h5fsszz9(VS.80).aspx

When converting between data types, the Visual Basic compiler can operate under strict or permissive type semantics. If strict type semantics are in effect, only widening conversions are permitted implicitly, and narrowing conversions must be explicit. Under permissive type semantics, you can attempt all widening and narrowing conversions implicitly. Type semantics apply to conversions between all data types, including object types.

0

Option Strict решит эту проблему. Но также «ClassA» не реализует никакого интерфейса. Таким образом, переключение определения класса A на следующее позволит решить вашу проблему:

Public Class ClassA 
    Implements IDoThingsC 

    Public Sub DoThings_A() 
    Debug.Print("Doing A things...") 
    End Sub 

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