三元运算符(?)不工作

时间:2015-12-23 20:39:05

标签: c# if-statement ternary-operator

为什么这不起作用?

DateTime? date = condition?DateTime.Now: null; //Error: no implicit conversion between DateTime and null

虽然这样做了吗?

DateTime? date;
if (condition)
{
  date = DateTime.Now;
}
else
  date = null;

可以找到一个类似的问题here,但我无法建立关联。谢谢你的帮助......

更新:我阅读了Jon Skeet推荐的spec document,并说:

If one of the second and third operands is of the null type and the type of the other is a 
reference type, then the type of the conditional expression is that reference type

那么,当使用三元运算符时,即使我已经指定了变量类型,也会强制进行转换?

2 个答案:

答案 0 :(得分:6)

  

为什么这不起作用?

要回答这个问题,我将引用错误消息:

  

DateTime和null之间没有隐式转换

DateTime.Now的类型为DateTimenull不是有效的DateTime值。编译器说它找不到DateTime.Nownull可以隐式地(因为你没有明确指定任何转换)转换为的任何常见类型。

但是,对于C#中的三元?:运算符,必​​须将第二个和第三个操作数转换为相同的类型,这也是涉及{的整个表达式的返回值的类型。 {1}}

显然,您想检索?:值 - DateTime?值未隐式转换为DateTime,但您可以明确地这样做:

DateTime?

这样,您告诉编译器将第二个操作数视为类型DateTime? date = condition ? (DateTime?)DateTime.Now : null; 。第三个操作数DateTime?可以隐式转换为null,因此不再存在矛盾,因此编译器错误消失了。

答案 1 :(得分:0)

这不起作用,因为无法评估表达式angular.module('app', ['ngAnimate', 'ui.bootstrap']) .controller('queryBuilderCtrl', ['$scope', '$compile', function($scope, $compile) { $scope.add = function() { var queryRow = angular.element(document.createElement('query-row')) $compile(queryRow)($scope) angular.element('query-row').append(queryRow) } }]) .directive('queryBuilder', function() { return { restrict: 'E', templateUrl: 'queryBuilderTemplate.html', link: function(scope, elem, attrs) { } } }).directive('queryRow', function() { return { restrict: 'EA', templateUrl: 'queryRowTemplate.html', link: function(scope, elem, attrs) { } } }); ,因为其类型不清楚。必须在分配之前评估表达式,并且分配的麻烦不在于此;它是对表达式的评价。这就是为什么if-then工作和三元运算符没有。