Почему компилятор C# не называет неявный оператор броска?

Попробуйте это:

В методе успеха Javascript

var obj1 = JSON.parse (resp);

$ ("div # sent_field"). Html (' '+ obj1.name +' ');

6
задан Nicol Bolas 17 October 2011 в 02:58
поделиться

2 ответа

Marc находится на правильных строках - это - раздел 7.2.4 в спецификации C# 3.0 - Разрешение Перегрузки Бинарного оператора.

В основном шаги:

  • Мы должны разрешить реализацию для "X + Y", где X и Y - оба MyNullable<Money>.
  • При рассмотрении раздела 7.2.5 (кандидат пользовательские операторы) мы заканчиваем с пустым множеством, как MyNullable<T> не перегружается +.
  • Назад в 7.2.4 набор операторов кандидата является встроенным набором бинарных операторов для +, т.е. int+int, decimal+decimal и т.д.
  • Правила разрешения перегрузки в 7.4.3 затем применяются. Когда мы делаем MyNullable<int> + MyNullable<int> это работает из-за неявных преобразований каждого аргумента int - но когда мы делаем MyNullable<Money> + MyNullable<Money> это не работает потому что Money + Money не находится в наборе операторов кандидата.
9
ответ дан 8 December 2019 в 12:23
поделиться

Это - интересный вопрос... он работает с Decimal, например, но нет TimeSpan, которые являются оба надлежащими типами.NET (в отличие от этого, float и т.д. это - примитивы), и оба имеют + оператор. Любопытный!

Конечно, можно скрутить руку с:

Money m3 = (Money)m1 + (Money)m2;

И это Вы просто используете Nullable<T> это будет работать бесплатно, конечно - плюс Вы получают компилятор + время выполнения (упаковка) поддержка. Есть ли причина не использовать Nullable<T> здесь?

Я посмотрю на спецификацию; тем временем Вы могли бы думать о продвижении оператора к MyNullable<T>; с постоянным клиентом Nullable<T>, компилятор C# обеспечивает "снятые" операторы для поддерживаемых типом, но Вы не можете сделать этого сами. Лучшее, которое можно сделать, предложить все очевидные и надеяться, что тип поддерживает его;-p Для доступа к операторам с дженериками посмотрите здесь, доступный для бесплатной загрузки здесь.

Обратите внимание, что Вы, вероятно, хотели бы применить соответствующие "снятые" проверки - т.е.

x + y => (x.HasValue && y.HasValue)
          ? new MyNullable<T>(x.Value + y.Value)
          : new MyNullable<T>();

Обновление

Другая обработка надеется касаться 14.7.4 (ECMA 334 v4) "Оператор сложения", где это предопределено для диапазона типов включая десятичное число (так, чтобы был плохой тест мной), с тех пор 14.2.4 (теми же) "Разрешениями перегрузки бинарного оператора", предопределенные операторы действительно получают особое упоминание. Я не утверждаю, что понял это полностью, все же.

10
ответ дан 8 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

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