2011-12-15 2 views
0

В моем коде я получил родовое, «GetProperty» как так:Как я могу вернуть примитив из метода с общим типом возврата?

public T getProperty<T>(int GUID, string property) 
{ 
    PropertyComponent prop; 
    prop = propDict[GUID]; 
    if(property.Equals("visible")) return (T) (Boolean) prop.visible; 
    if(property.Equals("enabled")) return prop.enabled; 
    if(property.Equals("position")) return (T) (Object) prop.position; 
} 

Визуальный компилятор студии не дает мне ошибку на 3-й срок, а prop.position является Vector2. Prop.visible и prop.enabled, однако, являются bool s, поэтому, когда я пытаюсь вернуть их таким образом, я получаю сообщение об ошибке «Невозможно преобразовать тип bool в T» (и «Невозможно неявно преобразовать тип bool в T» для 2).

Каков правильный способ вернуть bool в этой ситуации?

+2

'(T) (object)' - правильный выбор для всех трех терминов. – Marc

+0

@Marc так ответ: «вы не можете использовать примитивы»? –

ответ

3

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

Если вы хотите вернуть экземпляры объекта ссылочного типа, а также данные типа значения (например, bool), вам придется «вставлять» типы значений в объекты, поскольку объект ссылочного типа является единственным общим знаменателем между ссылочными типами и типами значений. Бокс происходит автоматически, когда вы присваиваете тип значения объекту. Итак, все ваши возвращаемые значения должны быть приведены к (T)(object).

+0

+1, хорошее объяснение. – Marc

+0

Итак, решение состоит в том, чтобы не попробовать его с примитивами; превратите все мои 'bool' в 'Boolean'. Понял. –

+0

@RavenDreamer 'bool' - это то же самое, что' Boolean' - ключевое слово bool является просто псевдонимом для 'System.Boolean'. – phoog

Смежные вопросы