我是泛型新手,我开始从MSDN库学习泛型。
我无法理解以下关于无界类型参数的要点。
没有约束的类型参数(如
T
inpublic class SampleClass<T>{}
)称为无界类型参数。无界类型参数有以下规则:
!=
和==
运算符,因为不能保证具体类型参数将支持这些运算符。null
相比。如果将无界参数与null
进行比较,则如果类型参数是值类型,则该比较将始终返回false
。我找不到上述各点的例子。如果有人给我一个例子来理解这些要点,那就太好了。
注:我的问题是关于!=
和==
运算符的使用.为什么不能在无界类型中使用这些运算符,如果将无界参数与false
进行比较,为什么总是返回null
发布于 2015-09-19 18:09:51
让我们假设一下这是可能的:
public class C
{
public bool AreEqual<T>(T first, T second)
{
return first == second;
}
}
现在假设一个名为F的struct
,它没有==
操作符的实现(默认情况下没有结构)。这里应该发生什么?
F first = new F();
F second = new F();
var c = new C();
Console.WriteLine(c.AreEqual(first, second));
值类型没有==
的实现,我们不能遵从Object.ReferenceEquals
,因为这也是一个值类型。这就是为什么编译器不允许您这样做的原因。
发布于 2015-09-19 17:57:04
类型参数可以具有约束,例如:where T: BaseClass
。这意味着T必须从BaseClass
继承。如果对类型参数没有这样的约束,则称为无界参数。
发布于 2015-09-19 18:07:56
从你引用的文件中可以看出两点:
不能使用!=和==运算符,因为不能保证具体类型参数将支持这些运算符。
这意味着编译器不能知道类型T
有运算符==
和!=
。一个SampleClass<int>
可以工作,但是如果MyType
没有实现操作符,SampleClass<MyType>
可能不能工作。由于T
是无界的,这意味着编译器无法知道期望的是什么,所以它必须采用最严格的情况。
您可以将其比作null。如果将无界参数比较为null,则如果类型参数是值类型,则该比较将始终返回false。
这只是指出您可以比较null,但是如果T
是一个非空类型,那么它总是返回false。请考虑以下几点:
int i = 0;
if (null == i)
{
}
这将生成一个编译器警告,因为您无法向i
提供使表达式为true
的值。
https://stackoverflow.com/questions/32671363
复制相似问题