将类型限制为特定类型

2024-02-03

是否可以将泛型方法限制在特定类型上?

我想写这样的东西:

public T GetValue<T>(string _attributeValue) where T : float, string
{
    return default(T); // do some other stuff in reality
}

我主要是想避免拥有一个巨人switch方法内的语句,或者如果指定了无效类型则必须抛出异常。

编辑:确认。我知道string不是值类型。我早些时候开始使用两种数字类型。对不起。


您不能使用通用约束来表达您感兴趣的限制。泛型并不意味着表达基于不相交类型的变化 - 它们意味着表达在类型层次结构(或实现某些接口的类型)上统一的变化。

不过,您还有一些替代选择。您选择哪个取决于您想要做的事情的确切性质。

使用不同命名的方法来表达每个操作。当每种方法真正做不同的事情时,我倾向于使用这种方法。您可能会争辩说,从方法返回不同类型的值本质上是不同的操作,并且应该有自己独特的名称。

float GetFloat(string attrName) { }
string GetString(string attrName) { }

提供“默认值”以允许推断类型。在许多通过名称请求值的设计中,提供默认值很有用。这可以让您使用重载来区分要调用的方法(基于默认值的类型)。不幸的是,这种方法非常脆弱——并且在将文字值传递给接受数字基元(int、uint、long)的重载时很容易崩溃。

float GetValue(string attrName, float defaultValue) { ... }
string GetValue(string attrName, string defaultValue) { ... }

使用通用方法,但如果该类型不是您支持的类型之一,则抛出运行时异常。就我个人而言,我发现这种丑陋并且违反了泛型的精神 - 泛型应该统一层次结构或实现某些接口的一组类型的功能。但是,在某些情况下,这样做是有意义的(假设无法支持一种特定类型)。这种方法的另一个问题是,无法从任何参数推断泛型方法的签名,因此您必须在调用它时指定所需的类型......此时它并没有好多少(从语法的角度来看)而不是具有不同的方法名称。

T GetValue<T>( string attrName )
{
   if( typeof(T) != typeof(string) ||
       typeof(T) != typeof(float) )
       throw new NotSupportedException();
   return default(T); 
}

// call it by specifying the type expected...
float f = GetValue<float>(attrName);
string s = GetValue<string>(attrName);

使用输出参数而不是返回值。这种方法效果很好,但它失去了能够调用方法并对返回值进行操作的简洁语法,因为您首先必须声明要填充的变量。

void GetValue( string attrName, out float value )
void GetValue( string attrName, out string value )

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

将类型限制为特定类型 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • Puppeteer 错误:导航失败,因为浏览器已断开连接

    我在 Google App Engine 上使用 puppeteer 和 Node JS 每当我在应用程序引擎上运行 puppeteer 时 我都会遇到一条错误消息 导航失败 因为浏览器已断开连接 这在本地环境中工作正常 所以我猜测这是应用
  • 根据列值拆分数据并创建散点图。

    我需要绘制散点图days vs age对于 f 组 性别 1 并绘制另一个散点图days vs age对于 m 组 性别 2 使用 R days age sex 306 74 1 455 67 2 1000 55 1 505 65 1 39
  • sqlite 查询子句中需要括号

    我正在运行以下 sqlite3 查询 并注意到前两个查询没有给出预期的答案 即 1240969 1225691 1531026 如果我在 or 子句周围使用括号 我会得到预期的结果 为什么是这样 sqlite gt select count
  • 根据与 R 中的字符串共享的值将颜色分配给数据框

    我在 R 中工作 我有许多不同的数据框 其中包含样本名称 我尝试根据样本名称为每个数据框中的每一行分配颜色 有许多行具有相同的样本名称 但我的输出数据很混乱 因此无法按样本名称排序 这是我所拥有的一个小例子 names lt c TC3 1
  • 如何减小 Android 中使用 FFMPEG 的默认摄像头捕获的视频大小?

    我正在尝试减小 Android 中默认摄像头 它正在生成高分辨率视频 捕获的视频大小 做FFMPEG有一个属性可以对给定分辨率的视频进行编码吗 我尝试谷歌 但所有示例都使用 FFMPEG 的命令行模式 我的问题是 我们可以在Android中
  • 获取每周的最后一个值以及匹配的日期

    所以我从pd Series called jpm 我想将其分组为几周 并取每周的最后一个值 这适用于下面的代码 它确实获得了最后一个值 但它将相应的索引更改为一周中的星期日 我希望它保持不变 import pandas datareader
  • 如何使用REUSE_ALV_FIELDCATALOG_MERGE功能模块?

    我正在尝试使用功能模块REUSE ALV FIELDCATALOG MERGE传递 ddic 中的字段标签以显示在 alv 报告的列标题中 但是 那没有用 如果我评论I STRUCTURE NAME TY YNAH CUS OBJ REQ
  • 使用 javascript 在 html 页面中查找单词

    如何快速搜索 html 页面中的单词 我怎样才能得到这个词所在的html标签 这样我就可以使用整个标签 要查找单词所在的元素 您必须遍历整个树 仅查找文本节点 并应用与上面相同的测试 在文本节点中找到单词后 返回该节点的父节点 var wo
  • 在seaborn中绘制带有孵化的堆积条形图

    我正在尝试使用带有孵化功能的seaborn matplotlib 绘制堆积条形图 但孵化不合适 如图所示 我的代码如下 sc bar sns barplot x Salt Concentration y EPS Produced data
  • Spring 元素必须指定引用或值

    我在 Spring 和构造函数注入方面遇到问题 我想动态创建具有名称的对象 String 和特殊 ID long 但是当加载 spring xml 文件时会发生异常 线程 main 中的异常 java lang ExceptionInIni
  • 将弹出窗口置于前面

    在我的应用程序中 我有一个弹出窗口 其中包含当我选择某些选项时打开的信息 第一次还可以 在所有内容前面弹出突出显示 但是 当它失去焦点时 当用户转到其他窗口时 如果用户再次单击同一选项 我希望弹出窗口再次显示在所有内容的前面 我尝试过类似的
  • iPhone 应用程序的分发(App Store)版本中出现错误

    我创建了一个具有自建照片工具的应用程序 当我测试 调试和临时 时 它工作正常 它是使用 UIScrollView 构建的 并在照片的插槽滚动到屏幕上时将每个照片添加到 UIScroll 视图 但现在该应用程序已在 App Store 中 并
  • 具有多个命令的 Git 别名的语法[重复]

    这个问题在这里已经有答案了 我想创建一个 Git 别名来执行多个命令 但我找不到有关如何完成此操作的文档 具有多个命令的 Git 别名的语法是什么 这是在哪里记录的 来自 man git config alias git 1 命令包装器的命
  • 如何向 R Shiny 表添加行

    我正在尝试使用 R Shiny 构建一个表单 一旦单击表单末尾的操作按钮 它将用于填充表格 我无法弄清楚如何获取表单中的数据并将其添加到表中的新行中 现在 它只是用表单中的任何内容不断更新第一行 我在这里重现了代码的简单版本 ui r li
  • UITabBarController 中的 UIViewController 和 UISplitViewController shouldAutorotateToInterfaceOrientation

    我的 iPad 代码有一些问题 我有一个 UITabBarController 其中包含一些 UIViewController 和 UISplitViewController 问题是 UIViewController 甚至 UISplitV
  • 使用 Javascript 动态创建具有递增 ID 的 dom 元素

    我有一个 ID 为 orangeButton 的 div 每次单击它时都会创建一个新的 div 这工作正常 但是 我希望每个新创建的 div 都有一个增量编号添加到它的 ID 中 我不知道该怎么做 这是我迄今为止带有注释的代码的小提琴 ht
  • Inno Setup 安装 - 访问被拒绝

    我已经使用 inno setup 创建了一个安装 我的应用程序 除其他外 运行后会在子文件夹中创建一个 pdf 文件 然后打开它 但 Windows 7 说访问被拒绝并弹出异常 怎么了 如何使用 innosetup 授予对子文件夹的访问权限
  • 在 python 中处理 try except 的更简洁的方法

    所以 假设我有 3 个不同的调用something something1 and something2 现在 我称之为 try something something1 something2 except Keyerror as e pri
  • VS2012中“从源代码管理中排除”发生了什么

    我想从 TFS 2012 源代码管理中排除代码文件夹中的某些文件 在 VS2012 之前 这是通过 源代码管理资源管理器 右键菜单中的 从源代码管理中排除 命令来完成的 但在VS2012中我找不到它 有人知道它在哪里吗 顺便说一句 我正在使
  • 将类型限制为特定类型

    是否可以将泛型方法限制在特定类型上 我想写这样的东西 public T GetValue