2016-06-24 4 views
0

Так что я натолкнулся на какое-то очень непонятное поведение родного тернарного оператора на C# сегодня. Тернарный оператор отправляет неверный тип данных методу, который я вызываю. Основной предпосылкой является то, я хочу, чтобы преобразовать десятичное значение в int если decimalEntry == false так будут храниться в базе данных в качестве int Вот код:Нечетное поведение оператора C#

decimal? _repGroupResult = 85.00 
int? intValue = null; 
bool decimalEntry = false; 

if (decimalEntry == false) 
{ 
    intValue = (int?) _repGroupResult; 
} 

Console.WriteLine("Sending to ResultAdd via ternary operator"); 
RepGBParent.ResultAdd(this.RepInfo.ResultID, decimalEntry ? _repGroupResult : intValue); 

Console.WriteLine("Sending to ResultAdd via if statement"); 
// All other tests - just add the rep group result 
if (decimalEntry) 
{ 
    RepGBParent.ResultAdd(this.RepInfo.ResultID, _repGroupResult); 
} 
else 
{ 
    RepGBParent.ResultAdd(this.RepInfo.ResultID, intValue); 
} 

метод, который я звоню ResultAdd здесь:

public void ResultAdd(int pResultID, object pResultValue) 
{ 
    if (pResultValue == null) { return; } 

    Console.WriteLine(this.TestInfo.TestNum + ": " + pResultValue.GetType()); 
    .... 
} 

Тройной оператор получает decimal в то время как if заявление посылает int. Как показано на выходном коде ниже:

enter image description here

Я считаю себя программистом разумного таланта, и это действительно бросил меня сегодня. Я играл с ним в течение 2-3 часов и выяснил лучший способ опубликовать его здесь, поэтому я не понимаю, что у меня есть.

Пожалуйста, избегайте ответов типа «почему вы так делаете это так». Я просто хочу знать, почему здесь существует разница между тернарным оператором и оператором if.

Единственный пост, который я обнаружил, что был тесно связан был этот один, но это не совсем совпадают:

Bizarre ternary operator behavior in debugger on x64 platform

+0

Я ненавижу, когда люди делают это, если (логическое значение == FALSE). Используйте if (! Bool) !!!! Однако не так плохо, как если бы (bool = true). – JSON

+0

@ JSON - и я ненавижу, когда люди приходят сюда и критикуют код, когда он делает нулевую разницу, если вы используете 'if (! Bool)' или 'if (bool == false)' с точки зрения функциональности. Это личное предпочтение просто и просто, и все это вопрос читаемости. Некоторые люди считают, что '!' Более читабельны, чем '== false', а некоторые нет. Я лично чувствую, что '== false' более прямолинейно понимают при просмотре кода. Легко пропустить один символ '!'. – jaredbaszler

ответ

8

Тройная оператор - хорошо - оператор который только особый вид метода. И как любой другой метод, он может иметь только один тип возврата.

Что вы пытаетесь сделать, это использовать оператор, чтобы вернуть decimal?или в int? в зависимости от состояния. Это невозможно.

Что происходит, так это то, что компилятор знает, что существует неявное преобразование от int? до decimal?, но не наоборот. Поэтому он возвращает тип возврата оператора как decimal? и неявно преобразует ваш intValue в decimal?.

+0

C#, похоже, наследует это поведение от C [как и C++] (http://stackoverflow.com/a/6179455/5922757). – Jezor

+0

Спасибо за быстрый ответ. Я должен был это понять сам. Это пятница, и настало время для коктейля! – jaredbaszler

4

Тернарное выражение возвращает один тип, а не тип, обусловленный результатом оценки.

Ваш int повышается до десятичного для полного выполнения этого требования.

Если преобразование не может быть применено, вы получите ошибку complier.

Либо тип выражения first_expression и second_expression должен быть одинаковым, либо неявное преобразование должно существовать от одного типа к другому.

https://msdn.microsoft.com/en-us/library/ty67wk28.aspx

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