![]() |
1
521
为了避免装箱,比较泛型是否相等的最佳方法是
这将匹配:
|
![]() |
2
114
这个怎么样:
使用
|
![]() |
3
26
我找到了一个 Microsoft Connect article 详细讨论了这个问题:
这是你能做的… 我已经验证了这两种方法都适用于引用类型和值类型的通用比较:
或
要与“=”运算符进行比较,需要使用以下方法之一: 如果T的所有情况都来自已知的基类,则可以让编译器知道使用泛型类型的限制。
编译器随后识别如何对
另一个选择是将t限制为实现
然后使用
|
![]() |
4
18
试试这个:
那应该编译,然后做你想做的。 |
![]() |
5
7
(编辑) Marc Gravell有最好的答案,但是我想发布一个简单的代码片段来演示它。只需在一个简单的C控制台应用程序中运行:
还有一件事:有人能将它作为一种扩展方法吗?我在这里停留在2005年,我很想看看是否允许。 编辑: 下面是如何使它作为扩展方法工作的:
|
![]() |
6
6
要处理所有类型的t,包括t是基元类型的地方,需要在两种比较方法中编译:
|
![]() |
7
2
这里会有问题的- 如果要允许对任何类型执行此操作,则对于引用类型,默认值(t)将始终为空,对于值类型,默认值(t)将始终为0(或充满0的结构)。 不过,这可能不是你想要的行为。如果希望以泛型方式工作,则可能需要使用反射检查t的类型,并处理不同于引用类型的值类型。 或者,您可以对此设置接口约束,接口可以提供一种检查类/结构默认值的方法。 |
![]() |
8
1
我认为您可能需要将这个逻辑分成两部分,并首先检查null。
在ISNULL方法中,我们依赖于ValueType对象不能定义为null,所以如果值恰好是从ValueType派生的类,我们就知道它不是NULL。另一方面,如果它不是一个值类型,那么我们只可以将值CAST与对象对NULL进行比较。我们可以直接转到cast to object来避免对value type的检查,但这意味着值类型将被装箱,这可能是我们希望避免的,因为它意味着在堆上创建了一个新对象。 在isnullorempty方法中,我们检查字符串的特殊情况。对于所有其他类型,我们正在比较 不 空)与它的默认值(对于所有引用类型来说都是空的,对于值类型来说通常是某种形式的零(如果它们是整数)。 使用这些方法,以下代码的行为与您预期的一样:
|
![]() |
9
0
我使用:
|
![]() |
10
-1
不知道这是否符合您的需求,但可以将t约束为实现接口(如icomparable)的类型,然后使用该接口(iirc支持/处理空值)中的compareSto()方法,如下所示:
可能还有其他接口,你也可以使用iequitable等。 |
![]() |
11
-2
@伊利提利:
运算符“=”不能应用于“t”和“t”类型的操作数 如果没有显式的空测试,然后调用Error方法或对象,我想不出这样的方法。 你可以设计一个使用系统比较的解决方案,但实际上,这会以更多的代码行来结束,并且大大增加了复杂性。 |
![]() |
12
-3
我觉得你很亲近。
现在,这将编译,但是如果
您只需要反向调用equals的对象,就可以使用一种优雅的空安全方法。
|
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |