Вы можете использовать регистр выбора, чтобы определить версию и расширение / формат файла Excel
If Val(Application.Version) < 12 Then
'You use Excel 97-2003
FileExtStr = ".xls": FileFormatNum = -4143
Else
'You use Excel 2007-2016
Select Case wb.FileFormat
Case 51: FileExtStr = ".xlsx": FileFormatNum = 51
Case 52:
If .HasVBProject Then
FileExtStr = ".xlsm": FileFormatNum = 52
Else
FileExtStr = ".xlsx": FileFormatNum = 51
End If
Case 56: FileExtStr = ".xls": FileFormatNum = 56
Case Else: FileExtStr = ".xlsb": FileFormatNum = 50
End Select
End If
Вот 2 примера
Использование VBA SaveAs в Excel 2007-2016 - Рон де Брюин Excel Automation
Predicate<T>
тип делегата. Вы никогда не можете происходить от делегатов.
Честно говоря, это не кажется, что наследование является действительно соответствующим здесь так или иначе - просто пишут метод, который возвращает инверсию оригинала. Это настолько просто:
public static Predicate<T> Invert<T>(Predicate<T> original)
{
return t => !original(t);
}
Предикат является делегатом. Вы не можете наследоваться типу делегата. Если Вы хотите получить инвертированное значение, используйте следующее:
Predicate<T> p;
Predicate<T> inverted = t => !p(t);
Функциональность делегата состоит в том, чтобы обработать список безопасных с точки зрения типов указателей метода. Разработчики C# решили, что нет ничего для добавления к этой функциональности и нет никакой причины изменить поведение на делегатов.
Так, Jon прав, наследование не является соответствующим здесь.
Делегаты могут указать на список методов. Мы добавляем к этому списку с + = оператор или с Делегатом. Объединение. Если подпись метода не является пустой затем, результат последнего вызываемого метода возвращается (если отзыв правильно).