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# 中的重载解析、扩展方法和泛型 的相关文章

  • 当我在 C 中将 long int 赋值给 int 时会发生什么?

    在最近的作业中 我被告知要使用long变量来存储结果 因为它可能是一个很大的数字 我决定在我的系统 英特尔酷睿 i5 64 位 Windows 7 gnu gcc 编译器 上检查这对我来说真的很重要 并发现以下代码 printf sizeo
  • C 中的隐秘结构定义

    我遇到了以下情况迷宫定义 https github com gduarte lkb blob master code stack maze h code typedef struct mazeNode int hasCheese int t
  • 以编程方式获取命名管道的系统名称

    我正在使用 WCF NetNamedPipeBinding 编写进程间通信 我的目标是让服务在 net pipe localhost service 上运行 所以我运行最简单的主机 host new ServiceHost contract
  • 返回带有列表对象的列表对象

    我有三个表 汽车品牌 汽车型号 和 CarsandModel 我有 Carsand 模型表 因为一个模型可以由多个制造商构建 我想返回包含汽车型号列表的汽车品牌列表 我现在的长篇大论不是过滤汽车型号的汽车制造商列表 我尝试添加一个 wher
  • 通过指向基址的指针删除对象而不使用虚拟析构函数

    我有代码 class A1 public A1 cout lt lt A1 virtual A1 cout lt lt A1 class A2 public A2 cout lt lt A2 A2 cout lt lt A2 class B
  • 如何将 int.TryParse 与可为空的 int 一起使用? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 TryParse 来查找字符串值是否为整数 如果该值为整数 则跳过 foreach 循环 这是我的代码 string strValue 42 if int TryParse trim strVal
  • tmpnam 的 C/C++ 线程安全性?

    我需要使用tmpnamC 中的函数 但我需要了解它的线程安全性 也就是说 如果我有多个线程 每个线程都需要为临时文件获取不同的名称 我是否可以保证每个线程都会收到具有不同名称的文件 tmpnam 仅保证该文件当时不存在 但它可能会在您自己创
  • 当假设 [[assume]] 包含 UB 时会发生什么?

    在 C 23 中 assume expression 属性使得如果表达 is false 行为未定义 例如 int div int x int y assume y 1 return x y 这会编译成相同的代码 就像y一直是1 div i
  • 如何使用 LINQ 对列表的列表进行分组(例如:List>)

    我知道我可以使用一些 for 循环轻松地做到这一点 但想看看是否有一种方法可以使用流畅的 LINQ 来做到这一点 我试图找出每个子列表中有多少个 我在看Enumerable SequenceEqual http msdn microsoft
  • MPI_Gather 分段错误

    我有这个并行高斯消除代码 调用以下任一方法时会发生分段错误MPI Gather函数调用 我知道如果没有为任一缓冲区正确分配内存 可能会出现此类错误 但我看不出内存管理代码有什么问题 有人可以帮忙吗 Thanks Notes 该程序从一个 t
  • 清理 STL 指针列表/向量

    您可以想出的最短的 C 块是多少来安全地清理std vector or std list指针 假设您必须对指针调用删除 list
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • c++ 最大 std::string 长度由堆栈大小或堆大小决定?

    正如问题中所问 std string myVar 它可以容纳的最大字符是由堆栈还是堆决定的 谢谢 默认情况下 分配的内存为std string是动态分配的 注意std string has a max size 函数返回实现支持的最大字符数
  • 使用 C 通过引用传递数组

    是的 我已经阅读了这个问题和答案 在 C 中通过引用传递数组 https stackoverflow com questions 1106957 pass array by reference in c 我有一个类似的问题 并从该问题中实现
  • 将 boost::iostreams::mapped_file_source 与 std::multimap 一起使用

    我有相当大量的数据需要分析 每个文件大约有 5gig 每个文件的格式如下 xxxxx yyyyy 键和值都可以重复 但键是按升序排列的 我正在尝试使用内存映射文件来实现此目的 然后找到所需的键并使用它们 这是我写的 if data file
  • try-catch 块是否会降低性能[重复]

    这个问题在这里已经有答案了 This link http www cplusplus com doc tutorial exceptions states 为了捕获异常 我们必须将一部分代码放在异常下 检查 这是通过将这部分代码包含在 tr
  • 将 LPTSTR 转换为要写入文件的字符串或 char *

    我想将 LPTSTR 转换为字符串或 char 以便能够使用 ofstream 将其写入文件 有任何想法吗 Use T2A http msdn microsoft com en us library 87zae4a3 VS 80 aspx宏
  • 隐藏 MediaPlayer 控件(Microsoft 媒体平台播放器框架)

    我在 c xaml 应用程序中使用 MMP PF 提供我自己的控制元素来处理播放器 这就是为什么我想隐藏 禁用出现在底部的本机控件 在屏幕截图的屏幕中间 这只是使用了一个主题 有人知道该怎么做吗 我没能找到合适的房产 像这样使用 axWin
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 如何在 C# 中使用 Selenium WebDriver 获取当前窗口的 URL?

    在我的应用程序中 登录时 它会导航到另一个页面 现在我需要在 selenium C 中使用 WebDriver 获取新的 URL 我找不到任何函数来执行此操作 我努力了driver Url driver getLocation and dr

随机推荐

  • 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