相关疑难解决方法(0)

关于短路的C#按位操作 - 为什么要转换为int?

short BitwiseTest(short value)
{
    short test1 = ((value >> 8) & 0xFF);
    short test2 = unchecked((short)((value << 8) & 0xFF00));
    return (test1 | test2);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码应该是一个(低效)示例,它在C#中交换短(带符号的16位整数)的字节序.

但是上面的代码不会编译,因为C#在以下两行中隐式地从short转换为int:

第一种情况:

short test1 = ((value >> 8) & 0xFF);
Run Code Online (Sandbox Code Playgroud)

第二种情况:

return (test1 | test2);
Run Code Online (Sandbox Code Playgroud)

为什么要进行演员表演?我是否可以通过简短的回归来实现预期的结果?像这样:

short BitwiseTest2(short value)
{
    short test1 = (short)((value >> 8) & 0xFF);
    short test2 = unchecked((short)((value << 8) & 0xFF00));
    return ((short)(test1 | test2));
}
Run Code Online (Sandbox Code Playgroud)

如果不是为什么不呢?

请注意,我确实理解为什么C#在执行左位移时将短路转换为整数,因此分配了test2变量.

c# syntax bitwise-operators implicit-cast

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

为什么C#中的8位和16位整数没有算术运算符(+, - ,*,/,%)?

我被震撼知道有没有算术运算符+,-,*,/,并%在C#中8个和16位整数.我正在阅读第23页的"C#5.0 Pocket Reference",如下所示.

在此输入图像描述

以下代码无法编译.

class Program
{
    static void With16Bit()
    {
        short a = 1;
        short b = 2;
        short c = a + b;
        Console.WriteLine(c);
    }

    static void With8Bit()
    {
        byte a = 1;
        byte b = 2;
        byte c = a + b;
        Console.WriteLine(c);
    }

    static void Main(string[] args)
    {
        With8Bit();
        With16Bit();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么C#设计师会这样做?他们对此有何看法?

c#

7
推荐指数
2
解决办法
461
查看次数

为什么我不能在字节上做布尔逻辑?

在C#(3.5)中,我尝试以下方法:

byte byte1 = 0x00;
byte byte2 = 0x00;
byte byte3 = byte1 & byte2;
Run Code Online (Sandbox Code Playgroud)

我得到错误132:"不能隐式地将类型'int'转换为'byte'.存在显式转换(你是否错过了演员?)".|也是如此 和^.

我究竟做错了什么?为什么要问我关于整数?为什么我不能在字节上做布尔逻辑?

.net c# byte boolean-logic

6
推荐指数
1
解决办法
2344
查看次数

Linq使用额外变量的多个连接条件

我有这个问题:

SELECT *
FROM transaction t
JOIN transactionDetail toTrans ON t.id = toTrans.tId and toTrans.FlowDirection= 1
JOIN transactionDetail fromTrans ON t.id = fromTrans.tId and fromTrans.FlowDirection= 0
Run Code Online (Sandbox Code Playgroud)

我试着用匿名类型重建,为解释在这里.

byte toFlow = 1;
byte fromFlow = 1;

from trans in data.Transactions
join toTrans in data.TransactionDetails on new {trans.id, toFlow} equals new {toTrans.tId, toTrans.FlowDirection}
join fromTrans in data.TransactionDetails on new { trans.id, fromFlow } equals new { fromTrans.tId, fromTrans.FlowDirection }
Run Code Online (Sandbox Code Playgroud)

Flowdirection总是1或0,所以我使用的是toFlow字节.但是,这会给出错误:

join子句中某个表达式的类型不正确.

根据这个答案,名称和类型都需要匹配.这意味着:

byte FlowDirection= 1;

from trans in …
Run Code Online (Sandbox Code Playgroud)

c# linq

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

不能隐式地将类型'int'转换为'short'?

我有3个变量都声明为'Int16'类型,但这段代码拒绝工作.

    private Int16 _cap;                 // Seat Capacity
    private Int16 _used;                // Seats Filled
    private Int16 _avail;               // Seats Available

    public Int16 SeatsTotal {
        get {
            return _cap;
        }
        set {
            _cap = value;
            _used = _cap - _avail;
        }
    }
Run Code Online (Sandbox Code Playgroud)

除了我所在的部分_used = _cap - _avail;抛出此错误,错误

1无法将类型'int'隐式转换为'short'.存在显式转换(您是否错过了演员?)

.net c#

4
推荐指数
1
解决办法
7613
查看次数

出于某种原因,不能将XOR运算符与两个char一起使用,有人知道为什么?

是否有一些正式标准不允许人们在C#中使用具有两个字符的^或XOR函数?

    public char[] XORinput(char[] input, char SN)
    {
        int InputSize = input.Length;
        //initialize an output array
        char[] output = new char[InputSize];

        for (int i = 0; i < InputSize; i++)
        {

            output[i] = input[i] ^ SN;

        }


        return output;

    }
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,此代码都给我这个错误,错误1400无法将类型'int'隐式转换为'char'.存在显式转换(您是否错过了演员?)

这没有任何意义.

呼叫者:

                string num = "12345";
                char SN = Convert.ToChar(num);//serial number

                string sCommand = ("Hellow");

                char[] out = new char[sCommand.ToCharArray().Length];


                out = calculator.XORinput(sCommand.ToCharArray(), SN);
Run Code Online (Sandbox Code Playgroud)

c# operators

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

为什么不选中不工作的字节?

unchecked关键字已在MSDN库中解释为:

unchecked关键字用于抑制整数类算术运算和转换的溢出检查.在未经检查的上下文中,如果表达式生成的值超出目标类型的范围,则不会标记溢出.

根据定义,它在int类型上运行良好.

例如:

unchecked
{
   int i=2147483647+10;
}
Run Code Online (Sandbox Code Playgroud)

这里它抑制了未经检查的块内的溢出.(它应该是)

但是当我们在字节上应用它时它不起作用

byte b1=100,b2=100,b3;
unchecked
{
   b3=b1+b2;//error here
}
Run Code Online (Sandbox Code Playgroud)

因此,应该抑制在未经检查的环境中编写的任何内容.

为什么它会给出编译时错误?

或者我根本不理解未经检查的关键字?

c#

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

为什么&运算符返回Int32而不是bool?

byte op1 = 20;
sbyte op2 = 30;
var result = op1 & op2;
Run Code Online (Sandbox Code Playgroud)

我知道&运营商返回bool,但我现在已经收费了.

为什么等于结果20?为什么结果是Int32?

c#

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

不明显的类型转换:x =(x + xstep <xmax?x + xstep:xmax)

鉴于以下代码:

    byte x, xmin, xmax, xstep;
    x = (x + xstep < xmax ? x + xstep : xmax)
Run Code Online (Sandbox Code Playgroud)

编译告诉我

Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?) 
Run Code Online (Sandbox Code Playgroud)

从byte到int的转换发生在哪里?为什么?

c# visual-studio

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

C++ CLR win32还是其他?

我正在使用C++,发现有不同种类的C++,如CLR,Win32,MFC ......

此外,我发现一些C++库可以在其他一些C#程序中调用.怎么会这样?

由于人们认为C++比C#更快,因为它不需要平台来运行它,但是,如果在CLR中使用C++,它是否会因为需要.Net框架而变慢?

问题是:我想创建一个调用windows命令并返回输出的C++库,这个库可以在其他C#程序中调用.有可能这样做吗?如果是的话,C++库是否需要.Net框架并且运行速度较慢?

c# c++ clr winapi

0
推荐指数
1
解决办法
1409
查看次数

"无法将类型'double'隐式转换为'byte'"

我试图将图像的红色值增加百分之五十.这是我的代码:

public static Bitmap IncreaseRedFiftyPercent(Bitmap b)
    {
        Bitmap temp = (Bitmap) b;
        Bitmap bmap = (Bitmap)temp.Clone();
        Color c;
        for (int i = 0; i < bmap.Width; i++)
        {
            for (int j = 0; j < bmap.Height; j++)
            {
                c = bmap.GetPixel(i, j);
                byte increase = c.R + c.R * 0.5;  //This line gives error

                bmap.SetPixel(i, j, Color.FromArgb(increase, c.G, c.B));
            }
        }
        b = (Bitmap)bmap.Clone();
        return b;
    }
Run Code Online (Sandbox Code Playgroud)

这就是我所做的:我读取图片的所有像素,并将红色值增加百分之五十,并保持蓝色和绿色相同.但行

byte increase = c.R + c.R * 0.5;  //This line gives error …
Run Code Online (Sandbox Code Playgroud)

c#

0
推荐指数
2
解决办法
1865
查看次数