2013-02-26 2 views
5

Я получил следующее исключение, которое, как представляется, указывает, что Guid не является объектом.Почему Guid НЕ является объектом в C#?

Выражение типа 'System.Guid' не может быть использован для возвращения типа 'System.Object'

Как Guid не объект?

И как этот компилятор это понял? Должно быть что-то, что позволило бы мне обнаружить во время выполнения, когда тип не является объектом, если да, то что бы это было?

Редактировать с дополнительной информацией =====================

Expression.Lambda<Func<object>>(SomeExpression) 

Где SomeExpression может быть постоянным значением Guid, при всем этом имеет значение.

+2

Это похоже на: http://stackoverflow.com/questions/2200209/expression-of-type-system-int32-cannot-be-used-for-return-type-system-object –

+0

Да, но это так, но Я не хочу бросать обязательно, как бы я узнал, будет ли что-то работать с места в карьер? Выражение работает нормально, пока я не занимаюсь родным/значением типа материала. – Alwyn

+3

В вашем вопросе отсутствует пример кода (и, желательно, код ошибки CSXXXX со ссылкой на MSDN, чтобы вы могли прокомментировать, что не ясно). –

ответ

17
Expression.Lambda<Func<object>>(SomeExpression) 

Проблема заключается в том, что вы неправильно используете деревья выражений. Несмотря на то, что операция ящика неявна в C#, она все еще существует. Это не неявный в деревьях выражений. Далее следует исправить:

Expression.Lambda<Func<object>>(
    Expression.Convert(SomeExpression, typeof(object)) 

Вы также можете проверить SomeExpression.Type.IsValueType решить, следует ли добавить дополнительное явное преобразование.

+0

Марк, неявное преобразование работает нормально, пока я не касаюсь Guid. Он отлично работает с моим словарем, списком, настраиваемым сложным классом - вы его называете. Я не думаю, что Guid является единственным исключением, но это определенно один из них. – Alwyn

+5

@ Алвин и все, что вы упоминаете, - это * ссылочный тип *. Как я уже сказал, операция ящика должна быть явной. 'Guid' - это * тип значения * (' struct') –

+0

@MarcGravell Gotcha, что объясняет много вещей, поэтому вам нужно бокс для типов значений. Все ссылочные типы получают бесплатный проход. – Alwyn

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