C# 中的重载解析、扩展方法和泛型

2024-01-04

我的 C# 源代码中有以下场景:

class A{}

class Dispatch<T>{}

static class DispatchExt
{
    public static void D<T>(this Dispatch<T> d, int a)
    {
         Console.WriteLine("Generic D chosen with a = " + a.ToString());
    }

    public static void D(this Dispatch<A> d, int a)
    {
         Console.WriteLine("D<A> chosen with a = " + a.ToString());
    }
}

class Program
{
     static void D<T>(Dispatch<T> d, int a)
     {
          d.D(a);
     }

     static void Main(string[] args)
     {
         int a = 5;
         var dispatch = new Dispatch<A>();
         dispatch.D(a);
         D(dispatch, a);
     }
}

当我运行此代码时,输​​出是:

"D<A>选择 a = 5"

“通用的D选择 a = 5"

这个结果让我很惊讶,因为我在期待“D<A>在这两种情况下都选择 a = 5"。

我想知道这种情况下的一般重载解析规则是什么,或者导致此输出的任何内容。此外,我想知道是否有办法在这两种情况下实现第一个输出。


扩展方法是在编译时仅使用从静态类型系统获取的信息进行解释的语法糖。

以你的第一个例子为例,你有这样的:

dispatch.D(a);

dispatch属于类型Dispatch<A>,存在一个扩展方法。所以编译器将其翻译为DispatchExt.D(dispatch, a)(非通用版本)。

在你的第二个例子中,你有这样的:

d.D(a);

d属于类型Dispatch<T>。所以这需要通用扩展方法DispatchExt.D<T>(d, a).

由于翻译发生在编译时,因此不考虑实际的运行时类型。


顺便说一句,这是。在其他情况下确定重载时使用相同的行为:仅考虑静态编译时类型:

A a = new A();
B b = new B();
A ba = b;

Test(a); // "a"
Test(b); // "b"
Test(ba); // "a"

使用以下定义:

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

C# 中的重载解析、扩展方法和泛型 的相关文章

  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • mysql:循环表并更改表添加索引

    我有大约 1000 个以相同前缀开头的表 table prefix SOME ID 我可以从另一个表中获取ID 循环的快速方法是什么allmysql 中的表并执行以下操作 ALTER TABLE table prefix some id A
  • 对于Azure B2C,有没有办法通过声明发送用户主体名称?

    我在将当前登录用户的用户名从 Azure b2c 获取到我的 Blazor Web 应用程序时遇到一些问题 本质上 我想创建一个用户名帐户 其中用户名是用户主体名称 我最初使用的是电子邮件注册策略 其中显示名称作为用户名 然而 b2c 并不
  • 如何在 PHP OOP 中连接控制器来查看?

    现在我使用 PHP OOP 编程 没有框架 我开始创建一个博客应用程序 首先 我创建一个 Bootstrap 文件 然后所有情况都应该通过它来处理 然后我创建一个处理程序类来处理登录和发布类 现在显示登录处理程序类中的值 然后如何连接到视图
  • 为什么 nuxt 中的“仅客户端”组件抱怨“窗口未定义”?

    我有 Vue SPA 我正在尝试迁移到 nuxt 我在用vue2leaflet在我包含的组件中
  • 使用上下文填充数据集 - Entity Framework 4

    我有一些从上下文返回的数据 数据已被拉取spCmsCategoriesReadHierarchy I need从上下文中获取所有数据并填充我的数据集 我的最终目标是用 DataSet 对象填充 TreeView 控件 有任何想法吗 感谢您的
  • 如何在 PHP 中验证 DKIM 签名?

    我承认我不太擅长密钥验证 我有一个从 POP3 服务器下载消息的脚本 并且我正在尝试验证 PHP 中的 DKIM 签名 我已经弄清楚了主体哈希 bh 验证检查 但我无法弄清楚标头验证 http www dkim org specs rfc4
  • Google Analytics - 跟踪单个 HTTP 请求中的多个事件

    我需要跟踪该项目在搜索结果 在网络应用程序中 中出现的次数 IE 用户搜索某些内容并获取前 20 个项目 跟踪第 20 个项目中每一个的 1 次访问 在另一个页面上 用户可以查看项目的统计信息 它在搜索结果中显示的次数 我考虑使用谷歌分析事
  • Vuejs:根据 eslint 规则对 html 数据进行 V-HTML 数据绑定

    我正在使用以下方法绑定 html 并显示在我的页面中 它工作完美 但是我收到来自 eslint 的警告 v html 指令可能导致 XSS 攻击 eslint vue no v html
  • LocalDB 和实体框架 6 - 安全性

    我正在尝试找出一种使用 LocalDB 代替 SQL 来进行 EF6 查询集成测试的方法 这将允许我们在构建服务器上运行集成测试 看来我应该能够在 SQL Express 中复制我的数据库 分离并导入到我的测试项目中 我希望从那里我可以修改
  • R:解析嵌套括号

    我想使用 R 解析嵌套括号 不 这不是 JASON 我见过使用 perl php 和 python 的示例 但我在 R 中无法正常工作 以下是一些数据的示例 a a a aa a a a a b b b b cc c c 我想根据三个父括号
  • 在 docker 容器内运行 pudb

    我更喜欢使用 pudb 进行 python 调试 我正在构建在 docker 容器内运行的 python 应用程序 有谁知道如何使 pudb 在 docker 容器内可用 谢谢 您需要在 Docker 容器上安装 pudb 可以通过将此行添
  • 使用 jquery 将项目添加到列表框

    如何使用 jquery 将项目添加到列表框 例如在下面的列表框中
  • 列出 CalendarApp.Color 中的枚举键

    尝试使用以下代码在 Google 脚本中获取 Google CalendarApp Color 枚举中的键列表 var colors CalendarApp Color for var x in colors Logger log Colo
  • 代码合同。如何抑制生成代码的警告?

    如何关闭对 Linq2Sql 代码的静态检查 您可以通过将有问题的类标记为来抑制对静态代码的检查 ContractVerification false 如果您生成的类是partial您可以创建另一个文件 其中包含另一个部分 ial 并将其添
  • 报表查看器中的重叠表格

    我有一个报告查看器控件 我向其中提供 SSRS 报告 生成的报告相当大 无法适应单一视图 因此 当我们在 Firefox 11 或 chrome 15 上的 ReportViewer 中看到该报告时 呈现的表格是重叠的 但它在 IE 中运行
  • 我可以将网页的图像捆绑到一个文件中吗?

    我有一个包含大约 70 张图像的网页 我正在寻找一种将这些图像捆绑到资源文件中的方法 这并不是为了提高客户端性能 因为缓存等会解决这个问题 更多的是通过我们的 cms 在服务器端进行资产管理 我希望能够将单个资源部署到 cms 中 而不必创
  • Pandas 和 Numpy 中有关多线程的奇怪错误

    Numpy 的大部分功能都会默认启用多线程 例如 我在 8 核 intel cpu 工作站上工作 如果我运行脚本 import numpy as np x np random random 1000000 for i in range 10
  • 使用 DataTrigger 动态设置事件处理程序

    我有几个项目控件 我需要为其附加一个事件处理程序 PreviewMouseLeftButtonDown 仅在满足特定条件时发生 我用数据触发器为我的控件设计了一种样式 我检查了它的绑定并用常规财产设置者对于 BorderThickness
  • 哪种 Objective-C 类型适合处理金钱?

    哪种 Objective C 类型适合处理金钱 我需要一些与核心数据兼容的东西 有两种解决方案 Use an int 并始终跟踪以美分为单位的货币价值 或您所使用的任何货币的最小可能划分 仅使用整数计算 Use NSDecimalNumbe
  • C# 中的重载解析、扩展方法和泛型

    我的 C 源代码中有以下场景 class A class Dispatch