首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么C#不支持变体泛型类?

为什么C#不支持变体泛型类?

提问于 2018-03-11 17:07:42
回答 2关注 0查看 171

以这个小的LINQPad为例:

代码语言:javascript
运行
AI代码解释
复制
void Main()
{
    Foo<object> foo = new Foo<string>();
    Console.WriteLine(foo.Get());
}

class Foo<out T>
{
    public T Get()
    {
        return default(T);
    }
}

它无法编译这个错误:

方差修改器无效。只有接口和委托类型参数可以指定为变体。

为什么这是不允许的呢?

回答 2

啊偶我去Skype

回答已采纳

发布于 2018-03-12 01:58:48

其中一个原因是:

代码语言:javascript
运行
AI代码解释
复制
class Foo<out T>
{
  T _store;
  public T Get()
  {
    _store = default(T);
    return _store;
  }
}

因此,我们是否可以允许它并不清楚。不允许它会刺激用户(它毕竟符合你建议的相同的潜在规则),但允许它很困难(分析已经有点棘手了,我们甚至没有开始寻找真正棘手的情况)。

另一方面,对此的分析要简单得多:

代码语言:javascript
运行
AI代码解释
复制
void Main()
{
  IFoo<object> foo = new Foo<string>();
  Console.WriteLine(foo.Get());
}

interface IFoo<out T>
{
  T Get();
}

class Foo<T> : IFoo<T>
{
  T _store;
  public T Get()
  {
    _store = default(T);
    return _store;
  }
}

由于类似原因,潜在的限制在类上比在界面上要困难得多,这也降低了协变类有用的程度。它们当然不会是无用的,但是平衡指定和实现有关允许执行什么规则的工作量是多么有用,远远低于协变接口的有用程度的平衡了解指定和实施它们的工作量。

红月

发布于 2018-03-12 02:14:21

一个类只需要包含输出方法参数和只有输入方法参数。重点是很难保证类:例如,协变类(通过T类型参数)不能有字段T,因为你可以写入这些字段。它对于真正不可变的类很有用,但目前还没有全面支持C#的不变性。

和开发者交流更多问题细节吧,去 写回答
相关文章
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
给.neter们整理了一份《.NET/C#面试手册》,目前大约4万字左右,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点,就当是查缺补漏!
全栈程序员站长
2022/09/14
2.8K0
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
C#动态调用泛型类、泛型方法
      主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用泛型类或泛型方法。控制台程序解决方案如下:
hbbliyong
2018/12/28
3.1K0
C#里面的泛型(T),泛型类,泛型方法,泛型接口等简单解释
只是比较简单的解释,在实际使用中,如果遇到需要深入研究的场景,再翻阅相关资料深入研究下。
zls365
2020/08/19
4.5K0
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ;
韩曙亮
2023/03/29
17K0
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
泛型接口,泛型类和泛型通配符
泛型的使用位置,除了最常见的约束集合元素,还可以使用在接口,类,方法上面。最本质的原因就是为了在使用接口,类,方法的时候,可以将类型作为参数,进行类型的参数传递。这样可以使程序的编写更加的灵活,在创建对象,调用方法的时候动态的指定类型,所以泛型也可以理解为类型的参数化。
用户5745563
2019/07/04
2.6K0
泛型接口,泛型类和泛型通配符
泛型类/泛型委托示例
using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Windows.Forms; namespace DeletegateT {     public partial class Form1 : Form     {         public Form1()         {             Initiali
菩提树下的杨过
2018/01/22
1.6K0
C# 泛型
泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为泛型。这会大大简化我们的代码结构,同时让后期维护变得容易。
宿春磊Charles
2022/03/29
5270
C#泛型
泛型(Generic) 是C# 2.0中的新增元素。这种机制允许将类名作为参数传递给泛型类型,并生成相应的对象。将泛型(包括类、接口、方法等)看作模板可能更好理解,模板中的变体部分将被作为参数传进来的类名称所代替,从而得到一个新的类型定义。   通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率。您只须一次性地将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。为此,需要使用 <和 > 括号,以便将一般类型参数括起来。 List<string> list = new List<strin
拾点阳光
2018/05/10
1.8K0
C# 泛型
泛型方法  ShowProp    对比    普通方法  ShowProp<T>
明志德道
2023/10/21
1880
C# 泛型
1、泛型的优势 在日常开发中,我们经常会开发一些特殊的功能,而这个功能适用于多个类型(比如string,int等多种类型),最简单的做法是给每种类型都做一个实现,这种做法的缺点是代码冗余,无疑增加了我们的工作量,第二种做法是通过object进行拆装箱转换,这种做法的缺点是Object类不是类型安全的,而且损失的性能比较大,遍历多项时,尤其如此。最好的方法是使用泛型,.NET自从2.0开始支持泛型,它不仅是编程语言的一部分,而且与程序集中间语言IL紧密结合。以下是泛型的优点 (1)、通过泛型我们不必给不同的类
郑小超.
2018/01/26
6800
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
冷环渊
2021/11/29
3.7K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
泛型类用法 : 使用时先声明泛型 , 如果不声明泛型 , 则表示该类的泛型是 Object 类型 ;
韩曙亮
2023/03/29
10.4K0
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
Dart中的泛型方法、泛型类、泛型接口
为了能在一个方法里实现传入什么数据类型就返回什么数据类型,可以利用泛型将方法写成下面这样:
越陌度阡
2020/12/10
4.2K0
Dart中的泛型方法、泛型类、泛型接口
【Kotlin】泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )
将 泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 ,
韩曙亮
2023/03/30
3.3K0
C#泛型详解
我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在方法中传入通用的数据类型,这样不就可以合并代码了吗?泛型的出现就是专门解决这个问题的。读完本篇文章,你会对泛型有更深的了解。 为什么要使用泛型 为了了解这个问题,我们先看下面的代码,代码省略了一些内容,但功能是实现一个栈,这个栈只能处理int数据类型: public class S
小端
2018/04/16
1.2K0
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 )
泛型作用 : 为 类 , 接口 , 方法 提供复用性 , 支持类型不确定的数据类型 ;
韩曙亮
2023/03/28
5.9K0
C#中的群集, 泛型和计时类
大家好,我是苏州程序大白,今天跟大家讲讲C#中数据结构体与算法。内容有点多。我这里会持续更新,希望大家关注我、支持我,谢谢大家。不废话了下面我们开始
苏州程序大白
2021/08/13
1.6K0
C#中的群集, 泛型和计时类
精:C# 泛型集合类List<T>使用总结
本文主要主要介绍了C# 泛型集合类List<T>使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
郑子铭
2023/08/29
5300
精:C# 泛型集合类List<T>使用总结
C#泛型详解
我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在方法中传入通用的数据类型,这样不就可以合并代码了吗?泛型的出现就是专门解决这个问题的。读完本篇文章,你会对泛型有更深的了解。
小端
2019/01/30
1K0
C#泛型类的简单创建与使用
本文介绍了如何创建一个简单的泛型类,并使用它来实现对不同类型数据的存储和访问。这个类包括两个泛型参数,用于表示存储的数据类型,以及两个私有字段,用于存储具体的数据。在类的构造函数中,我们使用这两个泛型参数来初始化这两个字段。通过调用类的 Run() 方法,可以输出存储在字段中的数据类型和具体值。
CNXY
2017/12/25
1.6K0
C#泛型类的简单创建与使用

相似问题

为什么需要泛型?

0181

如何使用基于Django类的泛型列表视图进行分页?

2355

云市场中的API 服务类商品为什么不支持退款 ?

1274

限制泛型扩展方法对字符串的扩展?

2237

cvm-amd标准入门型主机支不支持java?

2358
相关问答用户
萃橙科技 | 合伙人擅长4个领域
擅长4个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档