相关疑难解决方法(0)

为什么"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
查看次数

为什么C#中的1 && 2是假的?

我对另一个问题感到沮丧.所以我写了这个例子.

在C中,以下是真实的.见演示

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)

c# boolean boolean-operations

13
推荐指数
2
解决办法
4216
查看次数

操作员如何重载真假工作?

您可以重载运算符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)

c# operator-overloading

8
推荐指数
2
解决办法
4789
查看次数

&&运算符重载和C#中的赋值 - 澄清?

下面这个非常有趣的问题, 这是源于这个问题-

我想退后一步 (删除动态环境):

看看这段代码:( 这个的一个变种)

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)

c#

7
推荐指数
1
解决办法
192
查看次数

检测到未分配的局部变量的错误(当动态变量影响代码流预测时)

文档暗示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'

只有当pdynamic.如果p输入为stringobject,则不会产生错误.

方法T 在返回之前需要设置变量,因此这个错误对我来说似乎是一种混乱(请注意,即使使用短循环&&,第二个语句也必须执行才能执行"then"块).

注意:您也可以下载此repro repo进行复制.

那么,这是一个合法的错误(我在C#7.0上)?我该怎么处理?

c#

3
推荐指数
1
解决办法
394
查看次数

为什么我不能在C#中重载+ =运算符?但我仍然可以使用它?

可能重复:
在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;否定一样.

所以我的问题是,我如何使用+ =作为我的结构或类.它似乎得到支持我似乎无法找到它的文档.

.net c# operator-overloading

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