为什么这不起作用?
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
那么,当使用三元运算符时,即使我已经指定了变量类型,也会强制进行转换?
答案 0 :(得分:6)
为什么这不起作用?
要回答这个问题,我将引用错误消息:
DateTime和null之间没有隐式转换
DateTime.Now
的类型为DateTime
。 null
不是有效的DateTime
值。编译器说它找不到DateTime.Now
和null
可以隐式地(因为你没有明确指定任何转换)转换为的任何常见类型。
但是,对于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工作和三元运算符没有。