методы расширения из C # dll не работают как расширения в VB.NET - PullRequest
4 голосов
/ 17 сентября 2010

на самом деле я не знаю, должны ли они работать

Я создал библиотеку на C #, и мне сказали, что один из моих методов не работает в VB.NET как расширение http://valueinjecter.codeplex.com/Thread/View.aspx?ThreadId=227498

это метод:

public static PropertyDescriptorCollection GetProps(this object o)
{
   return GetProps(o.GetType());
}

1 Ответ

5 голосов
/ 17 сентября 2010

В общем, методы расширения C # прекрасно работают в VB.Net и наоборот. Единственным исключением является случай, когда параметр this явно введен в Object. По унаследованным причинам VB.Net не поддерживает использование методов расширения для ссылок, набираемых на Object.

Причина, по которой это возможно, может заставить код молча перекомпилироваться с другой семантикой. VB.Net (и C #) придерживается позиции, что импорт пространства имен, содержащего методы расширения, не должен вызывать автоматическое повторное связывание существующего кода с методом расширения. Если VB.Net разрешает методы расширения для Object, то для вызовов с поздним связыванием будет возможно молча повторно выполнить привязку к методу расширения и, следовательно, изменить код.

Например. Рассмотрим следующее, написанное перед вашим методом расширения.

Dim local As Object = ... 
local.GetProps() ' This is a late bound call

Если бы VB.Net позволял определять метод расширения GetProps для Object, тогда простой импорт вашего пространства имен изменит значение GetProps с позднего связывания на вызов метода расширения.

...