首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >泛型C#中的无界类型参数

泛型C#中的无界类型参数
EN

Stack Overflow用户
提问于 2015-09-19 17:42:56
回答 4查看 797关注 0票数 2

我是泛型新手,我开始从MSDN库学习泛型。

我无法理解以下关于无界类型参数的要点。

没有约束的类型参数(如T in public class SampleClass<T>{} )称为无界类型参数。无界类型参数有以下规则:

  • 不能使用!===运算符,因为不能保证具体类型参数将支持这些运算符。
  • 你可以和null相比。如果将无界参数与null进行比较,则如果类型参数是值类型,则该比较将始终返回false

我找不到上述各点的例子。如果有人给我一个例子来理解这些要点,那就太好了。

注:我的问题是关于!===运算符的使用.为什么不能在无界类型中使用这些运算符,如果将无界参数与false进行比较,为什么总是返回null

EN

回答 4

Stack Overflow用户

发布于 2015-09-19 18:09:51

让我们假设一下这是可能的:

代码语言:javascript
运行
复制
public class C
{
     public bool AreEqual<T>(T first, T second)
     {
           return first == second;
     }
}

现在假设一个名为F的struct,它没有==操作符的实现(默认情况下没有结构)。这里应该发生什么?

代码语言:javascript
运行
复制
F first = new F();
F second = new F();
var c = new C();
Console.WriteLine(c.AreEqual(first, second));

值类型没有==的实现,我们不能遵从Object.ReferenceEquals,因为这也是一个值类型。这就是为什么编译器不允许您这样做的原因。

票数 4
EN

Stack Overflow用户

发布于 2015-09-19 17:57:04

类型参数可以具有约束,例如:where T: BaseClass。这意味着T必须从BaseClass继承。如果对类型参数没有这样的约束,则称为无界参数。

票数 0
EN

Stack Overflow用户

发布于 2015-09-19 18:07:56

从你引用的文件中可以看出两点:

不能使用!=和==运算符,因为不能保证具体类型参数将支持这些运算符。

这意味着编译器不能知道类型T有运算符==!=。一个SampleClass<int>可以工作,但是如果MyType没有实现操作符,SampleClass<MyType>可能不能工作。由于T是无界的,这意味着编译器无法知道期望的是什么,所以它必须采用最严格的情况。

您可以将其比作null。如果将无界参数比较为null,则如果类型参数是值类型,则该比较将始终返回false。

这只是指出您可以比较null,但是如果T是一个非空类型,那么它总是返回false。请考虑以下几点:

代码语言:javascript
运行
复制
int i = 0;
if (null == i)
{
}

这将生成一个编译器警告,因为您无法向i提供使表达式为true的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32671363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档