Да, ожидается с TextureView
. TextureView заставляет видео проходить через обычную композицию представления для рендеринга, в отличие от SurfaceView, который компонуется непосредственно в графическом процессоре (конвейер декодирования выполняет рендеринг непосредственно в область экрана, где вы размещаете SurfaceView
). В то время как рендеринг TextureView
аппаратно ускорен, он все еще проходит через дополнительные шаги для дополнительной гибкости, и есть определенный удар по производительности. Кроме того, любой код, выполняемый в потоке пользовательского интерфейса, может влиять на TextureView
в отличие от SurfaceView
.
Дополнительная информация:
Причина, по которой
Derived d = (int)3;
не работает, состоит в том, что тип Derived
не совсем соответствует возвращаемому значению оператора Base
, как требуется. для вызова этого оператора. Обратите внимание, что вы не предоставили никаких операторов преобразования, содержащих код new Derived (...)
, поэтому неудивительно, что вы не можете создавать новые экземпляры Derived
таким образом .
Однако обратите внимание, что противоположное преобразование
Derived v = ...;
string s = (string)v;
будет работать нормально (как если бы оно было «унаследовано», хотя на самом деле это не наследование из-за ключевого слова static
).
Нет, так работать не будет. Компилятор не будет неявно выполнять понижающее преобразование от базовой к производной для вас. В принципе, нельзя ...
Нет, это не так. Вот подсказка:
public ** static ** неявный оператор Base (int Value)
статические методы в C # - это просто глобальные функции с доступом к частным членам класса. Они никогда не передаются по наследству
Перегруженные операторы (включая преобразования) наследуются, но не так, как вы, казалось бы, ожидаете. В частности, они не расширяются волшебным образом для работы с производными типами. Давайте еще раз посмотрим на ваш код:
Derived d = 3;
На этом этапе у компилятора есть два класса для работы: System.Int32 и Derived. Поэтому он ищет операторы преобразования в этих классах. Он будет учитывать те, которые унаследованы от Derived from Base, а именно:
public static implicit operator Base(int Value);
public static explicit operator string(Base Value);
Второй не соответствует, потому что аргумент должен быть Int32. Первый действительно соответствует аргументу, но тогда его возвращаемый тип - Base, а этот не соответствует. С другой стороны, вы можете написать это:
string s = (string) new Derived();
И это будет работать, потому что явный оператор в Base существует и применим (ожидается, что аргумент будет Base, Derived наследуется от Base и, следовательно, соответствует типу аргумента.
Причина, по которой компилятор не может автоматически "правильно" переопределять операторы преобразования в производных типах, заключается в том, что нет универсального способа сделать это.
The conversion/operator methods are a convenience but as others have noted, they're not always going to do what you want. Particularly, if the compiler doesn't see the right types on both sides of the = sign, it won't even consider your conversion/operator. This is why if you do the following you get a compiler warning:
object str = "hello";
if ( str == "hello" ) {
}
Furthermore, custom conversions are not considered when using the as/is keywords.
When thinking about implementing an explicit/implicit conversion, you should also consider implementing IConvertible and/or implementing a TypeConverter. This gives you a lot more flexibility when having a base class handle type conversions.