почему я не могу быть компактным со своим желаемым полиморфизмом C#?

Я думаю, что могло бы быть легче сделать это с пользовательским подлинным бэкендом и таким образом устранить необходимость специализированного ModelAdmin.

я сделал что-то похожее с этим отрывком: http://www.djangosnippets.org/snippets/74/

5
задан Sarah Vessels 23 October 2009 в 19:09
поделиться

7 ответов

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

XmlWriter writer = String.IsNullOrEmpty(outfile)
    ? XmlWriter.Create(Console.Out)
    : XmlWriter.Create(outfile);
18
ответ дан 18 December 2019 в 05:31
поделиться

Компилятор C # выбирает метод для статического выполнения во время компиляции. IL, который создается при компиляции, является ссылкой на конкретный метод. Часть полиморфизма проявляется во время выполнения, когда он выбирает, какую реализацию этой конкретной функции выполнять.

Ваш оператор?: Оценивается во время выполнения, и поэтому компилятор не может определить, какой метод выполнить.

Изменить на это и будет работать.

XmlWriter writer = string.IsNullOrEmpty(outfile) ? 
    XmlWriter.Create(Console.Out) :
    XmlWriter.Create(outfile);
3
ответ дан 18 December 2019 в 05:31
поделиться

Проблема в том, что вы не можете определить во время компиляции, что

(string.IsNullOrEmpty(outfile) ? Console.Out : outfile)

должно вернуть. Будет ли это строка или TextWriter? Это можно определить только во время выполнения, отсюда и ошибка компиляции, потому что? оператор должен быть разрешен во время компиляции.

Лучшее, что вы можете извлечь из этого, вероятно, будет:

XmlWriter writer = string.IsNullOrEmpty(outfile)
    ? XmlWriter.Create(Console.Out)
    : XmlWriter.Create(outfile);
2
ответ дан 18 December 2019 в 05:31
поделиться

Здесь происходит несколько вещей

Во-первых, «исключение» возникает из-за Тернарного оператора (tm), а не из-за того, где вы его используете. Проблема в том, что у вас есть одно выражение, которое пытается вернуть два разных типа, которые не могут быть преобразованы в один общий базовый тип (кроме объекта).

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

2
ответ дан 18 December 2019 в 05:31
поделиться

Нет, вам нужно сделать два отдельных вызова, поскольку они являются двумя отдельными конструкторами.

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

Кроме того, условный оператор может возвращать только один тип данных, вы не можете заставить его возвращать разные типы данных в зависимости от выбора.

1
ответ дан 18 December 2019 в 05:31
поделиться

C # статически типизирован, вся магия полиморфизма происходит во время компиляции. И тип вашего условного выражения не известен во время компиляции.

1
ответ дан 18 December 2019 в 05:31
поделиться

Кажется, все предполагают следующее:

XmlWriter writer = String.IsNullOrEmpty(outfile)
    ? XmlWriter.Create(Console.Out)
    : XmlWriter.Create(outfile);

Однако это также выполнимо:

XmlWriter writer = XmlWriter.Create(string.IsNullOrEmpty(outfile)
    ? Console.Out : new StreamWriter(outfile));

Последний вариант ближе к вашей первоначальной попытке и, IMO, более компактный.

7
ответ дан 18 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

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