小编Sel*_*enç的帖子

C#中的无符号移位使用Java语义来表示负数

我正在尝试将Java代码移植到C#,我遇到了与无符号右移操作符相关的奇怪错误>>>通常代码:

long l = (long) ((ulong) number) >> 2;
Run Code Online (Sandbox Code Playgroud)

将相当于Java:

long l = number >>> 2;
Run Code Online (Sandbox Code Playgroud)

但是对于-2147483648L你可能认识到的情况,这会Integer.MIN_VALUE返回一个不同于Java的数字,因为强制转换会ulong改变数字的语义,因此我得到了不同的结果.

在C#中,这样的事情怎么可能?

我想尽可能保留代码语义,因为它是一个非常复杂的代码体.

c# java bit-manipulation

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

为什么Dictionary <T,V>显式实现ICollection <KeyValuePair <T,V >>,当它已被IDictionary <T,V>继承时

最近我的朋友问我为什么在它已经被继承时Dictionary<T, V>显式实现?ICollection<KeyValuePair<T, V>>IDictionary<T,V>

我意识到我也不知道答案.以下是官方文档的链接:

Dictionary<T, V>- http://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx IDictionary<T,V> - http://msdn.microsoft.com/en-us/library/s4ys34ea(v=vs. 110)的.aspx

有没有具体的理由为什么这样做?是否有特定的架构模式或任何东西?

.net c# dictionary

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

继续获取LINQ to Entities的异常不支持LINQ表达式节点类型'Invoke'

我正在使用C#(包括Linq)来开发Web应用程序.我编写了一个泛型方法来扩展任何实体的Get方法.但是,当我得到运行时异常时,执行代码时,"LINQ to Entities"不支持LINQ表达式节点类型"Invoke".以下是代码:

using System.Linq;
using System.Linq.Expressions;
using LinqKit;

public static class ServiceExtension
{
    public static IEnumerable<T> GetActive<T>(this ICrudService<T> crudService, Expression<Func<T, bool>> where)
        where T : class, IDeletable
    {
        return crudService.Get(where.And(w => !w.IsDeleted));
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我做错了什么吗?

.net c# linq entity-framework

5
推荐指数
2
解决办法
6892
查看次数

为什么在使用非短路 AND 运算符时会取消引用可能为空的引用警告?

我有一个这样的方法,它是生产代码中一些逻辑的简化版本:

static void Foo(int a, int b, string x, string y)
{
     if (a > 100 && b < 50 && (x != null) & (y != null))
     {
          Console.WriteLine(y.Length);
     }
}
Run Code Online (Sandbox Code Playgroud)

访问y.Length.

如果我更改&&&,警告就会消失。乍一看我不明白为什么,然后我认为这可能是因为&操作符是可重载的,所以行为可能会改变,true甚至当y为空时它也可能评估为。我的假设是正确的还是我错过了其他东西?

注意:我可以使用 Visual Studio 2019 在面向 .NET Core 3.1 或 .NET Standard 2.0 的应用程序中重现这一点。

c# nullable-reference-types

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

为什么编译器无法推断出对象数组类型?

我想知道为什么这是有效的:

object[] array = {"bla bla bla..", 23, true};
Run Code Online (Sandbox Code Playgroud)

但这些不是:

var array = {"bla bla bla..", 23, true };
var array2 = new [] {"bla bla bla..", 23, true };
Run Code Online (Sandbox Code Playgroud)

在第二个例子中,为什么编译器不能根据数组初始值设定项中的值推断出数组类型?这似乎很容易,特别是与泛型类型推断相比.为了定义一个对象数组,为什么我必须明确指定数组类型?

var array = new object[] { "bla bla bla..", 23, true };
Run Code Online (Sandbox Code Playgroud)

c# arrays type-inference

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

为什么ViewBag.SomeProperty在属性不存在时不会抛出异常?

MVC,有时我ViewBag根据某些条件设置特定属性.例如:

if(someCondition)
{
   // do some work
   ViewBag.SomeProperty = values;
}

return View();
Run Code Online (Sandbox Code Playgroud)

在我的View我检查属性是否为null这样的:

@if(ViewBag.SomeProperty != null)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我认为应该抛出一个异常,因为如果我的条件不满意则SomeProperty永远不会被设置.这就是为什么我总是使用一个else语句将该属性设置为null.但是我只是注意到,它不会抛出异常即使该属性不存在.例如,Console Application如果我执行以下操作,我得到一个RuntimeBinderException:

dynamic dynamicVariable = new {Name = "Foo"};

if(dynamicVariable.Surname != null) Console.WriteLine(dynamicVariable.Surname);
Run Code Online (Sandbox Code Playgroud)

但是,当涉及到它不会发生ViewBag.什么是的区别

c# asp.net-mvc dynamic

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

如何获得具有out参数的方法?

我们假设我在一个类中有两个方法,如下所示:

class Foo
{
    public void Convert(string s, int x){ }

    public void Convert(string s, double x) { }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用:

var method = typeof (Foo)
            .GetMethod("Convert", new[] {typeof (string), typeof (int)});
Run Code Online (Sandbox Code Playgroud)

我得到了正确的方法.但是如果我改变xout在第一个方法中使它成为参数:

public void Convert(string s, out int x) { }
Run Code Online (Sandbox Code Playgroud)

然后我得到了第二种方法Convert(string s, double x).

在此输入图像描述

我不明白为什么它不返回第一种方法或至少不返回null第二种方法?第二种方法的签名与我提供的类型不匹配.如何在第二种情况下获得正确的方法?有没有办法直接得到它?我知道我可以获得所有方法,然后根据参数类型过滤它们,但我认为应该有一个直接的方法来做到这一点,我想念它...

c# reflection parameters out

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

有没有办法确定参数是否具有此修饰符?

我想确定一个参数是否有this修饰符使用Reflection.我已经查看了ParameterInfo类的属性,但找不到任何有用的东西.我知道扩展方法只是语法糖但我相信应该有一种方法来确定一个方法是一种扩展方法.

从其他静态方法(在中定义的区别扩展方法唯一的静态,公共类)是this改性剂.

例如,这不是扩展方法:

public static int Square(int x) { return x * x; }
Run Code Online (Sandbox Code Playgroud)

但这是:

public static int Square(this int x) { return x * x; }
Run Code Online (Sandbox Code Playgroud)

那么Reflection如果可能的话,如何区分两种使用方法或其他方法呢?

c# reflection extension-methods

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

为什么ref参数不能像out参数一样被忽略?

C#7引入内联out参数的具体原因是ref什么?

以下内容适用于C#7:

int.TryParse("123", out _);
Run Code Online (Sandbox Code Playgroud)

但这是无效的:

public void Foo(ref int x) { }

Foo(ref _); // error
Run Code Online (Sandbox Code Playgroud)

我没有看到为什么不能将相同的逻辑应用于ref参数的原因.

c# ref-parameters c#-7.0

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

LINQ序列 - 它们如何在IL中链接?

无论我使用表达式查询语法还是方法语法,IL看起来几乎都是一样的.

将LINQ查询作为"渐进式语法"执行:

IEnumerable<Employee> query1 = _employees.Where(e => e.Location.Equals("California"));
IEnumerable<Employee> query2 = query1.OrderByDescending(e => e.Name);
IEnumerable<string> query3 = query2.Select(e => e.Name);
Run Code Online (Sandbox Code Playgroud)

产生:

IL_0001: ldarg.0      // this
IL_0002: ldfld        class [mscorlib]System.Collections.Generic.IList`1<class Fundamentals.LINQ.Employee> Fundamentals.LINQ.Syntax::_employees
IL_0007: ldsfld       class [mscorlib]System.Func`2<class Fundamentals.LINQ.Employee, bool> Fundamentals.LINQ.Syntax/'<>c'::'<>9__3_0'
IL_000c: dup          
IL_000d: brtrue.s     IL_0026
IL_000f: pop          
IL_0010: ldsfld       class Fundamentals.LINQ.Syntax/'<>c' Fundamentals.LINQ.Syntax/'<>c'::'<>9'
IL_0015: ldftn        instance bool Fundamentals.LINQ.Syntax/'<>c'::'<TestMethodSyntaxProgressive>b__3_0'(class Fundamentals.LINQ.Employee)
IL_001b: newobj       instance void class [mscorlib]System.Func`2<class Fundamentals.LINQ.Employee, bool>::.ctor(object, native int)
IL_0020: dup          
IL_0021: stsfld       class [mscorlib]System.Func`2<class Fundamentals.LINQ.Employee, bool> Fundamentals.LINQ.Syntax/'<>c'::'<>9__3_0'
IL_0026: call         class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0/*class Fundamentals.LINQ.Employee*/> …
Run Code Online (Sandbox Code Playgroud)

c# linq

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