Оператор как и универсальные классы

Если вы переместите линию

Vue.prototype.$hi = () => alert('hi');

выше

let component = new TestComponent().$mount(wrapper)

, она будет работать. Ваш первый компонент ссылается на $hi() до его определения.

29
задан abatishchev 7 April 2010 в 13:41
поделиться

4 ответа

Необходимо добавить

where T : class

к Вашему объявлению метода, например.

T Execute<T>()  where T : class
{

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

MyClass c = whatever.Execute() as MyClass;

Или если они хотят бросить на сбой:

MyClass c = (MyClass)whatever.Execute();

Универсальный метод обертки похож на это:

MyClass c = whatever.Execute<MyClass>();

Все три версии должны указать точно те же три объекта, только в различных заказах, таким образом, ни один не так более прост или больше удобен, и все же универсальная версия скрывает то, что происходит, тогда как "необработанные" версии, каждый проясняет, будет ли бросок или a null.

(Это может быть не важно Вам, если Ваш пример упрощен из Вашего фактического кода).

59
ответ дан Daniel Earwicker 28 November 2019 в 01:00
поделиться

Вы не можете использовать as оператор с универсальным типом без ограничения. Начиная с as оператор использует пустой указатель для представления этого, он не имел типа, Вы не можете использовать его на типах значения. Если Вы хотите использовать obj as T, T должен будет быть ссылочный тип.

T Execute<T>() where T : class
{
  return Execute() as T;
}
12
ответ дан Samuel 28 November 2019 в 01:00
поделиться

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

int result = Execute<int>();

очень не отличается от

int result = (int)Execute();

Можно использовать модификатор, чтобы записать результат в переменную в объеме вызывающей стороны и возвратить булев флаг, чтобы сказать, успешно выполнилось ли это:

bool Execute<T>(out T result) where T : class
{
    result = Execute() as T;
    return result != null;
}
1
ответ дан Cecil Has a Name 28 November 2019 в 01:00
поделиться

Существует ли шанс, которые Выполняются (), мог бы возвратить тип значения? Если так, затем Вам нужны метод Earwicker для типов классов и другой общий метод для типов значения. Мог бы быть похожим на это:

Nullable<T> ExecuteForValueType<T> where T : struct

Логика в том методе сказала бы

object rawResult = Execute();

Затем необходимо было бы получить тип rawResult и видеть, может ли он быть присвоен T:

Nullable<T> finalReturnValue = null;

Type theType = rawResult.GetType();
Type tType = typeof(T);

if(tType.IsAssignableFrom(theType))
{
    finalReturnValue = tType;     
}

return finalReturnValue;

Наконец, заставьте свой оригинал Выполнить фигуру сообщения, которая T, имеет (класс или тип структуры), и назовите соответствующую реализацию.

Примечание: Это от грубой памяти. Я сделал это приблизительно год назад и вероятно не помню каждую деталь. Однако, я надеюсь, указывая, что Вы в общем направлении помогаете.

1
ответ дан Charlie Flowers 28 November 2019 в 01:00
поделиться
Другие вопросы по тегам:

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