为什么 VS 警告我 typeof(T) 永远不是泛型方法中提供的类型,其中类型参数仅限于实现 T?

2024-01-05

我希望这个问题是正确的,所以让我们举个例子。想象一下以下通用方法:

public abstract class Base : IDisposable
{
    public static IEnumerable<T> GetList<T>()
        where T : Base
    {
        // To ensure T inherits from Base.
        if (typeof(T) is Base)
            throw new NotSupportedException();

        // ...
    }
}

根据MSDN http://msdn.microsoft.com/de-DE/library/bb384067.aspx关键字where限制类型参数T属于类型Base或者从这个类继承。

[...] where 子句可以包含基类约束,该约束声明类型必须将指定的类作为基类(或者是该类本身)才能用作该泛型类型的类型参数。

这段代码也可以编译:

public static T GetFirst()
    where T : Base
{
    // Call GetList explicitly using Base as type parameter.
    return (T)GetList<Base>().First();
}

所以当遵循最后一个代码时typeof(T)应该返回Base,不应该吗?为什么 Visual Studio 会向我打印此警告?

警告 CS0184:给定的表达式绝不是提供的(“Demo.Base”)类型。


typeof(whatever)总是返回类型的实例Type. Type不源自Base.

你想要的是这样的:

if(typeof(T) == typeof(Base))
    throw new NotSupportedException("Please specify a type derived from Base");

看起来相同的东西是这样的:

if(variableOfTypeT is Base)

但这有不同的含义。
第一条语句(与typeof(Base))仅是true if T is Base。这将是false对于任何派生自的类型Base.
第二条语句(variableOfTypeT is Base) 总是true在你的班级中,因为任何派生自Base将返回true检查其基类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 VS 警告我 typeof(T) 永远不是泛型方法中提供的类型,其中类型参数仅限于实现 T? 的相关文章

  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 如何查找boost运行时版本

    我正在编写一个使用 boost 的 C 库 在这个库中 我想包含有关用于编译我的库的二进制版本的 boost 版本的信息 我可以使用宏BOOST VERSION这很好 我还想确定哪个是 boost 的运行时版本 以便我可以与用于编译我的库的
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 多个源文件中包含包含“const”的头文件

    Why does not包含定义的头文件const并被多个源文件包含会产生编译错误multiple definition const in header file h const int num 5 int x Error Multiple
  • 如何以编程方式确定 C 中 int 数据的最大和最小限制?

    我正在尝试 K R 的练习 2 1 练习内容如下 编写一个程序来确定范围char short int and long变量 两者signed and unsigned 通过从标准标题打印适当的值并通过直接计算 如果计算它们会更困难 确定各种
  • 在 C++ 中,严格别名规则中的“访问”是什么意思?

    3 10 10 说 如果一个程序试图access通过除以下类型之一之外的泛左值存储对象的值 行为未定义 然而 术语 访问 并没有在任何地方定义 在这种情况下这意味着read or 读取或修改 在 C 标准中 它被明确定义为读取或修改 然而在
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • Visual Studio 2012 - 数据库发布向导已停止?

    我正在使用 VS 2012 和 SQL Server 2008 刚刚注意到服务器资源管理器中缺少 发布到提供商 选项 据此 数据库发布向导已停止使用 http forums asp net post 5122271 aspx http fo
  • 如何使用 Caliburn.Micro MVVM 将焦点设置到控件

    我有一个表单 我想在发生某些用户操作时将焦点设置到文本框 我知道 MVVM 的处理方式是绑定到 VM 属性 但是 TextBox 没有允许这种情况发生的属性 从虚拟机设置焦点的最佳方法是什么 我创建了一个 IResult 实现 可以很好地实
  • Parallel.For 和 Break() 误解?

    我正在研究 For 循环中的并行性中断 看完之后this http tipsandtricks runicsoft com CSharp ParallelClass html and this http reedcopsey com 201
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 在同一条线上铸造两次

    我在项目中看到了这段代码 b的类型是void void b int a int unsigned long b 这条线毫无意义吗 我的意思是 这与a int b在所有情况下 这可能会避免 64 位 Unix 系统上的编译器警告unsigne
  • 如何从标准输入读取一行,阻塞直到找到换行符?

    我试图从命令行的标准输入一次读取任意长度的一行 我不确定是否能够包含 GNU readline 并且更喜欢使用库函数 我读过的文档表明getline应该可以工作 但在我的实验中它不会阻塞 我的示例程序 include
  • 为了清楚起见,是否应该在返回类型上使用无用的类型限定符?

    当我们的头文件中有原型时 我们的静态分析工具会抱怨 返回类型上有无用的类型限定符 例如 const int foo 我们这样定义它是因为该函数返回一个永远不会改变的常量 认为 API 看起来更清晰const到位 为了清楚起见 我觉得这类似于
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足

随机推荐

  • 使用 Python 通过 ssh 执行命令

    我正在编写一个脚本来自动执行 Python 中的一些命令行命令 目前 我正在拨打这样的电话 cmd some unix command retcode subprocess call cmd shell True 但是 我需要在远程计算机上
  • 在 Terraform 中使用本地 Docker 镜像

    我想在 Terraform 中使用本地 Docker 映像 更具体地说 我有一个 Google Cloud Build Pipeline 它构建了一个 Docker 映像 我想将其部署到带有 Terraform 的 GCP Cloud Ru
  • 为什么 int j = 012 给出输出 10?

    在我的实际项目中偶然发生了这里是我修改的小程序 我不明白为什么它会给出输出10 public class Int public static void main String args int j 012 accidentaly i put
  • fusion 能看穿新型包装吗?

    Given newtype MyVec MyVec unVec Data Vector deriving Functor etc 这将创建 类似于 instance Functor MyVec where fmap f MyVec Data
  • 如何使用 django-tables2 从自定义 sql 渲染表?

    我正在使用 Django 和 django tables2 在 Web 界面中很好地表示 sql 查询 我有一个遗留的 sql 代码 通过标准 models py 定义它非常非常复杂 问题是 如何使用 django tables2 从自定义
  • ld:找不到 -lz 的库

    这让我发疯 当我尝试在模拟器上编译时 一切正常 但在设备上我收到此错误 ld library not found for lz Command Developer Platforms iPhoneOS platform Developer
  • 新版 Google Play 管理中心出现数以千计的奇怪崩溃

    Google Play 管理中心的 ANR 和崩溃部分最近已更新 可显示更多 ANR 和崩溃 自动从选择加入的用户收集 我在各种 Android 版本和设备上发现了很多奇怪的新崩溃 1 最常见的 每周出现数千次 没有任何类名的 ClassN
  • 什么是$cacheFactory?

    我完全找不到任何关于具体内容的信息 cacheFactory是什么以及它如何在您的应用程序中发挥作用 角度文档说 构造缓存对象并提供对它们的访问的工厂 cacheFactory http docs angularjs org api ng
  • 从数组中创建列表

    进行练习时遇到困难雄辩的Javascript书 http eloquentjavascript net 任务是从数组中创建一个列表 该列表是这样的 var list value 1 rest value 2 rest value 3 res
  • 样式输入文件和自动提交

    我试图有一个用户单击的单个文本链接 它会询问用户他 她想要上传哪个文件 然后自动将其发布到表单中 我怎样才能达到同样的效果 我知道我必须设置文件输入的样式 但如何让它在选择文件时自动发布 非常感谢 在页面中嵌入 javascript 是不好
  • Django:模板中显示的多维字典

    我有以下视图 但发现无法通过模板显示 sm request session get active semester semester dates SemesterDates objects filter semester sm schedu
  • jQuery 文件大小

    在jQuery的官方网站上 他们说缩小后的文件大小是18k 但是下载后 我发现是53 9K 下载后我需要做一些压缩吗 该网站声称它已缩小为 18kgzipped 因此 您需要设置 Web 服务器来压缩 JavaScript 文件才能查看文件
  • Outlook VSTO 功能区到主页 tabControlId

    我正在写一个VSTO http en wikipedia org wiki Visual Studio Tools for Office 微软Outlook http en wikipedia org wiki Microsoft Outl
  • 使用 Gmail API 从 Gmail 下载附件

    我在用邮箱API https developers google com gmail api访问我的 Gmail 数据以及谷歌Python API客户端 https github com googleapis google api pyth
  • 从 sklearn.pipeline.Pipeline 获取转换器结果

    我正在使用一个sklearn pipeline Pipeline我的聚类对象 pipe sklearn pipeline Pipeline transformer1 transformer1 transformer2 transformer
  • Javascript 按随机百分比机会执行函数

    可以说 我想按百分比机会触发一个函数 function A console log A triggered 50 chance to trigger if Math random gt 0 5 A 现在我想添加更多功能来偶然触发 我所做的是
  • Excel 将字段添加到 Xml 映射

    我在 Excel 2010 工作表上有一个 XML 地图 我会定期从 XML 文件的内容中刷新该地图 我最近向 XML 数据添加了一个新字段 并希望它显示在我的 XML 地图上 我只是希望能够添加新字段 但它看起来虽然必须再次导入整个结构
  • 您可以使用 NEST 2 从 InnerHits 获得强类型命中吗?

    我正在使用 NEST 2 客户端对我们的 Elasticsearch 执行查询 我们有一个查询 用于查询嵌套文档数组 并使用 InnerHits 在结果中包含嵌套文档的匹配项 有没有办法将 InnerHits 的结果强类型化到特定的 POC
  • 在 Firemonkey 中移动无边框表单

    在我使用的VCL形式中WM 系统命令 但在 firemonkey 中它是未声明的 我测试这段代码 procedure TForm4 dragPanelMouseDown Sender TObject Button TMouseButton
  • 为什么 VS 警告我 typeof(T) 永远不是泛型方法中提供的类型,其中类型参数仅限于实现 T?

    我希望这个问题是正确的 所以让我们举个例子 想象一下以下通用方法 public abstract class Base IDisposable public static IEnumerable