Я пытаюсь использовать выражение для создания этого:Expression.Condition: типы аргументов не соответствуют
bool.Parse("true") ? default(int?) : 1
BTW, я использую bool.Parse("true")
просто держать VS от жалуясь недостижимыми путями коды, так просто предположим, что он использует константу true
. Когда я пишу мое выражение, как это ...
Expression.Condition(Expression.Constant(true), Expression.Default(typeof(int?)),
Expression.Constant(1))
... Я получаю ошибку Argument types do not match
. Я почти уверен, что я в курсе того, что происходит, поэтому я изменил свое выражение, чтобы сделать это:
Expression.Condition(Expression.Constant(true), Expression.Default(typeof(int?)),
Expression.New(typeof(int?).GetConstructor(new[] { typeof(int) }), Expression.Constant(1)));
Это работает, но я не могу сказать, что я люблю писать выражение, которое является эквивалентом этого:
bool.Parse("true") ? default(int?) : new int?(1)
Есть ли способ заставить это тернарное выражение работать без создания нового экземпляра int?
? Возможно, это нормально, потому что C# неявно создает новый экземпляр в моем конкретном примере?
Редактировать
Я должен отметить, что я только использую Expression.Constant()
эмулировать возвращаемое значение из MethodCallExpression
для того, чтобы упростить мой пример кода. Поэтому в этом случае все, что предполагает использование постоянных значений в качестве решения, не будет работать.
Я не понимаю, в чем проблема с 'new int? (1)'. Что именно вам не нравится в этом? – svick
@svick Я не хочу создавать новый экземпляр чего-то, когда могу просто повторно использовать существующий экземпляр. Мне нравится ответ dasblinkenlight, который предлагает лить в 'int?'. – oscilatingcretin
Какой пример? 'int?' не является ссылочным типом, а C# 'new' не является C++' new'. 'new int? (1)' делает то же самое, что и '(int?) 1'. – svick