为什么不bool?支持解除&&和||?他们本可以提升true和false操作员,这些操作员会间接地增加&&和提升||.
运营商|和&已取消和落实正确的三值逻辑.但当然,他们并没有像||和那样短路&&.
问题是为什么他们在创建规范时决定不提升这些操作符.所以"就像这样,因为规范说的如此"对"为什么?"没有答案.
当抬起true并false让null既不是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 && anything和true || anything将短路(false和true在这两个例子中没有编译时间常数).
这与 …
我对另一个问题感到沮丧.所以我写了这个例子.
int main()
{
printf("%d", 1 && 2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1
Run Code Online (Sandbox Code Playgroud)
在C#中.这是假的.为什么这是假的?此外,我不明白为什么我需要在这个例子中创建bool运算符,但不是在我的另一个问题,但无论如何.为什么以下是假的?对我来说完全是无稽之谈.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyInt a=1, b=2;
bool res=a && b;
Console.WriteLine("result is {0}", res);
}
class MyInt
{
public int val;
public static bool operator true(MyInt t) { return t.val != 0; }
public static bool operator false(MyInt t) { return t.val == 0; …Run Code Online (Sandbox Code Playgroud) 您可以重载运算符true和false我查看了示例并找到了这个http://msdn.microsoft.com/en-us/library/aa691312%28v=vs.71%29.aspx
我完全不明白他们是如何工作的.我知道如果我写if(obj)并且true返回true则执行if.什么是错误的回报并不重要.但假工作怎么样?在该文档中,建议&&运算符使用它.我写了下面的代码.我不知道如何让&&编译.|| 也给了我一个编译错误.我怎么会被称为虚假?以及如何获得&&和|| 上班?
var ts= new MyTimeSpan();// ts += ts;
if (ts){ Console.WriteLine("Is true"); }
else { Console.WriteLine("not true"); }
//Console.WriteLine(ts && ts ? "Y" : "N");
class MyTimeSpan
{
public static MyTimeSpan operator +(MyTimeSpan t, MyTimeSpan t2) { return new MyTimeSpan(); }
public static bool operator true(MyTimeSpan t) { return true; }
public static bool operator false(MyTimeSpan t) { return false; }
}
Run Code Online (Sandbox Code Playgroud) 下面这个非常有趣的问题, 这是源于这个问题-
我想退后一步 (删除动态环境):
看看这段代码:( 这个的一个变种)
void Main()
{
int a;
int b = 100;
Console.WriteLine(X.M(1, out a));
}
public class X
{
public int H=0;
public static X M(int x, out int y)
{
Console.WriteLine("x = "+x);
y = x;
return new X(x);
}
public X(){}
public X(int h)
{
H=h;
}
public static bool operator false(X x) {Console.WriteLine("in false operator for "+ x.H); return true; }
public static bool operator true(X …Run Code Online (Sandbox Code Playgroud) 文档暗示out参数在发送到函数之前不需要初始化(仅声明).但是,这段代码:
class Program
{
static void Main()
{
dynamic p = "";
string s;
if (p != null && T(out s))
System.Console.WriteLine(s);
}
static bool T(out string s)
{
s = "";
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
给出构建错误:
使用未分配的局部变量's'
只有当p是dynamic.如果p输入为string或object,则不会产生错误.
方法T 在返回之前需要设置变量,因此这个错误对我来说似乎是一种混乱(请注意,即使使用短循环&&,第二个语句也必须执行才能执行"then"块).
注意:您也可以下载此repro repo进行复制.
那么,这是一个合法的错误(我在C#7.0上)?我该怎么处理?
可能重复:
在C#中重载复合赋值运算符的简单方法?
我正在玩事件,思想事件很奇怪.为什么我不能在泛型类中实现它们.所以我试着发现我不能超载+ =.从这里找到的语言规范
The overloadable unary operators are:
+ - ! ~ ++ -- true false
The overloadable binary operators are:
+ - * / % & | ^ << >> == != > < >= <=
Run Code Online (Sandbox Code Playgroud)
+ =未列出.现在,在你说没有理由重载之前+ =我想提出事实C#有使用+ =运算符的事件以及我试图实现一个有趣的事件并希望使用+ =运算符的事实.现在,我有一种感觉,有人会说这就是为什么事件存在,因为这是唯一的原因.但是我想提出你可以使用+ =与TimeSpan结构.去试试吧,var ts= new TimeSpan(); ts += ts;将编译并运行.
我查看了TimeSpan的定义,我不知道它是如何允许的.我看到了一个public static TimeSpan operator +(TimeSpan t);看起来很可疑的东西,但后来我意识到它var name = +ts;就像你怎么能做到var name = -ts;否定一样.
所以我的问题是,我如何使用+ =作为我的结构或类.它似乎得到支持我似乎无法找到它的文档.