Методы преобразования implicity/explicit наследованы в C#?

Да, ожидается с TextureView. TextureView заставляет видео проходить через обычную композицию представления для рендеринга, в отличие от SurfaceView, который компонуется непосредственно в графическом процессоре (конвейер декодирования выполняет рендеринг непосредственно в область экрана, где вы размещаете SurfaceView). В то время как рендеринг TextureView аппаратно ускорен, он все еще проходит через дополнительные шаги для дополнительной гибкости, и есть определенный удар по производительности. Кроме того, любой код, выполняемый в потоке пользовательского интерфейса, может влиять на TextureView в отличие от SurfaceView.

Дополнительная информация:

7
задан Jonathon Reinhart 4 July 2013 в 04:53
поделиться

5 ответов

Причина, по которой

Derived d = (int)3;

не работает, состоит в том, что тип Derived не совсем соответствует возвращаемому значению оператора Base , как требуется. для вызова этого оператора. Обратите внимание, что вы не предоставили никаких операторов преобразования, содержащих код new Derived (...) , поэтому неудивительно, что вы не можете создавать новые экземпляры Derived таким образом .

Однако обратите внимание, что противоположное преобразование

Derived v = ...;
string s = (string)v;

будет работать нормально (как если бы оно было «унаследовано», хотя на самом деле это не наследование из-за ключевого слова static ).

7
ответ дан 6 December 2019 в 19:41
поделиться

Нет, так работать не будет. Компилятор не будет неявно выполнять понижающее преобразование от базовой к производной для вас. В принципе, нельзя ...

3
ответ дан 6 December 2019 в 19:41
поделиться

Нет, это не так. Вот подсказка:

public ** static ** неявный оператор Base (int Value)

статические методы в C # - это просто глобальные функции с доступом к частным членам класса. Они никогда не передаются по наследству

0
ответ дан 6 December 2019 в 19:41
поделиться

Перегруженные операторы (включая преобразования) наследуются, но не так, как вы, казалось бы, ожидаете. В частности, они не расширяются волшебным образом для работы с производными типами. Давайте еще раз посмотрим на ваш код:

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 и, следовательно, соответствует типу аргумента.

Причина, по которой компилятор не может автоматически "правильно" переопределять операторы преобразования в производных типах, заключается в том, что нет универсального способа сделать это.

2
ответ дан 6 December 2019 в 19:41
поделиться

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.

1
ответ дан 6 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: