标签: lifted-operators

什么是解除运营商?

我正在看这篇文章,并且正在努力遵循解释提升运算符的VB.NET示例.似乎没有相应的C#示例或教程.我一般都没有太多关于运算符重载的经验,因此在阅读可空类型的同时尝试使用VB.NET等价物可能不是最好的开始...

是否有人能够解释提升的运算符以及它们如何被可空类型使用?它只是意味着可空类型本身不会重载运算符,并将使用它所代表的基础类型的运算符吗?

关于提升的运营商似乎没有太多关于SO的信息,所以希望这也可以帮助其他人.

.net c# nullable lifted-operators

56
推荐指数
1
解决办法
9364
查看次数

为什么"bool?"上没有解除短路操作符?

为什么不bool?支持解除&&||?他们本可以提升truefalse操作员,这些操作员会间接地增加&&和提升||.

运营商|&已取消和落实正确的三值逻辑.但当然,他们并没有像||和那样短路&&.

问题是为什么他们在创建规范时决定不提升这些操作符.所以"就像这样,因为规范说的如此"对"为什么?"没有答案.

当抬起truefalsenull既不是true也不是false:

public static bool operator true(bool? x) 
{
    return x.HasValue && x.Value
}

public static bool operator false(bool? x) 
{
  return x.HasValue && !x.Value
}
Run Code Online (Sandbox Code Playgroud)

这将产生&&||表现就像他们的非短路对应物.不同之处在于false && anythingtrue || anything将短路(falsetrue在这两个例子中没有编译时间常数).

这与 …

c# operator-overloading short-circuiting lifted-operators

18
推荐指数
1
解决办法
930
查看次数

将struct与null进行比较时,编译器警告错误

请考虑以下代码:

DateTime t = DateTime.Today;

bool isGreater = t > null;
Run Code Online (Sandbox Code Playgroud)

使用Visual Studio 2010(C#4,.NET 4.0),我收到以下警告:

警告CS0458:表达式的结果始终为'bool'类型的'null'

这是不正确的; 结果总是false(类型bool):

现在,struct DateTime重载>(大于)运算符.任何不可为空的结构(如DateTime)都可以隐式转换为相应的Nullable<>类型.上面的表达式完全相同

bool isGreater = (DateTime?)t > (DateTime?)null;
Run Code Online (Sandbox Code Playgroud)

这也产生了同样的错误警告.在这里,>操作员是提升的操作员.如果HasValue其两个操作数中的任何一个是,则返回false false.否则,提升的运算符将继续将两个操作数展开到底层结构,然后调用该>结构定义的重载(但在这种情况下,这不是必需的,其中一个操作数不是HasValue).

你能重现这个bug,这个bug是众所周知的吗?我误解了什么吗?

对于所讨论int的运算符重载的所有结构类型(不是简单类型,而不是枚举类型),这是相同的.

(现在如果我们使用==而不是>,那么一切都应该完全相似(因为DateTime也会使==运算符超载).但它不相似.如果我说

DateTime t = DateTime.Today;

bool isEqual = t == null;
Run Code Online (Sandbox Code Playgroud)

没有得到警告☹有时候你会看到人们不小心检查变量或参数为null,没有意识到他们的变量类型是一个结构(它过载==而且不是一个简单的类型int).如果他们得到警告会更好.)


更新:使用Visual Studio 2015的C#6.0编译器(基于 Roslyn …

c# comparison nullable compiler-warnings lifted-operators

11
推荐指数
2
解决办法
941
查看次数

将裸null文本与用户定义的运算符一起使用时的好奇重载决策

(标题中的"用户定义"是指C#标准的加法和减法,TimeSpanDateTime不是C#标准的一部分.它们在BCL中定义.)

在可空TimeSpanDateTime值上玩弄提升的运算符,我写了下面的代码.请注意,这个框架提供了不同的操作TimeSpanDateTime.

有一个对称(和可交换)的加法,你接收两个TimeSpan并返回总和TimeSpan.这个加法的"逆"是减去两个,TimeSpan产生一个TimeSpan.

然后是另一种加法,非对称,你拿一个DateTime(左操作数)和一个TimeSpan(右操作数)来产生一个DateTime.由于此操作的不对称性,它有两种"反转"类型:一种是DateTime从中减去两种以获得TimeSpan差异,另一种是从中DateTime减去一种并从中减去一种TimeSpan以产生结果DateTime.

static void Main()
{
  DateTime? n_dt = new DateTime(2012, 12, 25);
  TimeSpan? n_ts = TimeSpan.FromDays(62.0);

  var a = n_dt + n_ts;   // OK
  var b = n_ts + n_ts;   // OK

  var c = null + n_dt;   // OK, string …
Run Code Online (Sandbox Code Playgroud)

c# null operator-overloading lifted-operators overload-resolution

5
推荐指数
1
解决办法
124
查看次数

System.Nullable <T> null*int值的值是多少?

请考虑以下陈述:

int? v1 = null;

int? v2 = 5 * v1;
Run Code Online (Sandbox Code Playgroud)

有什么价值 v2?(null或空字符串?)

如何防止编译器将其标记为无效操作?我是否需要遵循自定义异常处理?

c# null nullable operators lifted-operators

4
推荐指数
2
解决办法
669
查看次数

比较两个空的nullables

C#5.0规范在第7.1.3章中介绍

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

false如果一个或两个操作数都是,则提升的运算符产生值null.

但是测试也是这个MSDN链接

http://msdn.microsoft.com/en-us/library/2cf62fcy(v=vs.100).aspx

int? num1 = 10;
int? num2 = null;

// Change the value of num1, so that both num1 and num2 are null.
num1 = null;
if (num1 == num2)
{
  // The equality comparison returns true when both operands are null.
  Console.WriteLine("num1 == num2 returns true when the value of each is null");
}

/* Output:
 * num1 == num2 returns true when the value of each is null
 */ …
Run Code Online (Sandbox Code Playgroud)

c# nullable lifted-operators

2
推荐指数
1
解决办法
105
查看次数