Я думаю, что столкнулся с подобной проблемой : VB.Net весьма рад компилировать с помощью методов расширения и оставить их для вывода во время выполнения, если Option Strict
выключено.
Однако VB.Net действительно не любит методы расширения для базовых типов. Вы не можете продлить Object
, и он не может разрешить его, если вы выполните:
C #
namespace NS
...
public static class Utility {
public static void Something(this object input) { ...
public static void Something(this string input) { ...
}
// Works fine, resolves to 2nd method
"test".Something();
// At compile time C# converts the above to:
Utility.Something("test");
Однако это не так в VB.Net:
Option Infer On
Option Explicit On
Option Strict Off
Imports NS
...
Dim r as String = "test"
r.Something()
Это компилируется без ошибок, но во время выполнения происходит сбой, поскольку Something
не является методом String
- компилятору не удалось заменить синтаксический сахар метода расширения статическим вызовом Utility.Something
.
Вопрос в том, почему? Ну, в отличие от C #, VB.Net не может обработать любое расширение Object
! Допустимый метод расширения в C # сбивает с толку компилятор VB.Net.
Как общее правило VB.Net, я бы избегал использования методов расширения с любым из базовых типов .Net (Object
, String
, Integer
и т. Д.). Вы также должны быть осторожны с Option Infer
, так как пока он включен по умолчанию в Visual Studio, он по умолчанию отключен для компиляций командной строки, VBCodeProvider
и, возможно, на веб-сайтах (в зависимости от вашего web.config). Когда он выключен, все в VB.Net считается Object
, и все методы расширения будут оставлены до времени выполнения (и, следовательно, не будут работать).
Я думаю, что Microsoft действительно отказалась, когда они добавили методы расширения в VB.Net, я думаю, что это было запоздалой попыткой (и неуспешной) привести ее в соответствие с C #.