相关疑难解决方法(0)

运算符==不能应用于C#中的泛型类型吗?

根据MSDN中==运营商的文档,

对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回true,否则返回false.对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true.对于字符串类型,==比较字符串的值.用户定义的值类型可以重载==运算符(请参阅运算符).用户定义的引用类型也是如此,尽管 默认情况下==的行为与上述预定义和用户定义的引用类型相同.

那么为什么这段代码片段无法编译呢?

bool Compare<T>(T x, T y) { return x == y; }
Run Code Online (Sandbox Code Playgroud)

我得到错误运算符'=='不能应用于'T'和'T'类型的操作数.我想知道为什么,因为据我所知,==运算符是针对所有类型预定义的?

编辑:谢谢大家.起初我没有注意到该声明仅涉及引用类型.我还认为为所有值类型提供了逐位比较,我现在知道这是正确的.

但是,如果我使用引用类型,==操作符是否会使用预定义的引用比较,或者如果类型定义了一个,它是否会使用运算符的重载版本?

编辑2:通过反复试验,我们了解到==操作员在使用不受限制的泛型类型时将使用预定义的参考比较.实际上,编译器将使用它可以为限制类型参数找到的最佳方法,但不会再看了.例如,true即使Test.test<B>(new B(), new B())被调用,下面的代码也会始终打印:

class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T …
Run Code Online (Sandbox Code Playgroud)

c# generics operators equals-operator

309
推荐指数
10
解决办法
10万
查看次数

C#中泛型参数的空或默认比较

我有一个像这样定义的泛型方法:

public void MyMethod<T>(T myArgument)
Run Code Online (Sandbox Code Playgroud)

我想要做的第一件事是检查myArgument的值是否是该类型的默认值,如下所示:

if (myArgument == default(T))
Run Code Online (Sandbox Code Playgroud)

但是这不能编译,因为我没有保证T将实现==运算符.所以我把代码改为:

if (myArgument.Equals(default(T)))
Run Code Online (Sandbox Code Playgroud)

现在这个编译,但是如果myArgument为null则会失败,这是我正在测试的一部分.我可以像这样添加一个显式的空检查:

if (myArgument == null || myArgument.Equals(default(T)))
Run Code Online (Sandbox Code Playgroud)

现在这让我感到多余.ReSharper甚至建议我将myArgument == null部分更改为myArgument == default(T),这是我开始的地方.有没有更好的方法来解决这个问题?

我需要支持两种引用类型和值类型.

c# generics

269
推荐指数
7
解决办法
7万
查看次数

什么是默认(对象); 做C#?

谷歌搜索只提出关键字,但我偶然发现了一些代码

MyVariable = default(MyObject);
Run Code Online (Sandbox Code Playgroud)

我想知道这是什么意思......

c#

123
推荐指数
4
解决办法
8万
查看次数

如何通过JIT编译器编译泛型?

我知道泛型是由JIT编译的(就像其他所有东西一样),与编译代码时生成的模板形成对比.
问题是可以使用反射在运行时创建新的泛型类型.
这当然会影响通用的约束.哪个已经通过了语义解析器.

有人能解释一下这是如何处理的吗?究竟发生了什么?
(代码生成和语义检查)

c# compiler-construction generics jit

28
推荐指数
1
解决办法
5038
查看次数