首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >扩展方法和泛型约束的问题

扩展方法和泛型约束的问题
EN

Stack Overflow用户
提问于 2010-10-23 08:29:19
回答 1查看 842关注 0票数 3

我有一个基接口和几个继承的接口。基接口有一些扩展方法,可以修改对象并返回基类的新实例(IChildA.Touch() => IBaseIBase.Touch() => IBase)。

对于一个继承路径(IChildB和子代),我想实现一些扩展方法,这些方法返回一个与调用对象(IGrandChildB.Touch() => IGrandChild)类型相同的对象。为此,我想指定一个被约束为IChildB后代的通用扩展方法。

到目前为止,这是有效的,但是现在编译器不能解析来自IChildA的调用。它尝试使用IChildB路径的扩展方法,但失败了,而不是使用IBase接口的扩展方法。有没有一种优雅的方法来解决这个问题?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IBase {}

public interface IChildA : IBase {}

public interface IChildB : IBase {}

public static class BaseExtensions
{
  public static IBase Touch(this IBase self) { return self; }
  public static T Touch<T>(this T self) where T : IChildB { return self; }
}

public static class TestClass
{
  public static void Test()
  {
    IChildA a = null;
    IBase firstTry = a.Touch();  //Cannot resolve to BaseExtensions.DoSomething(this IBase obj)
    IBase secondTry = ((IBase)a).Touch();  //Resolves to BaseExtensions.DoSomething(this IBase obj)

    IChildB b = null;
    IChildB touchedB = b.Touch();
  }
}
EN

回答 1

Stack Overflow用户

发布于 2011-03-23 09:46:18

我不知道您的具体用例,但是如果您删除非泛型方法,而是将泛型方法约束为IBase,那么示例仍然可以编译。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IBase {}

public interface IChildA : IBase {}

public interface IChildB : IBase {}

public static class BaseExtensions
{
    public static T Touch<T>(this T self) where T : IBase { return self; }
}

public static class TestClass
{
    public static void Test()
    {
        IChildA a = null;
        IBase firstTry = a.Touch();

        IChildB b = null;
        IChildB touchedB = b.Touch();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4003117

复制
相关文章
iOS中将图片保存到自定义相册中
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53412675
用户1451823
2018/09/13
1.2K0
Django2.0中文(会话、用户、注册)
//cookie不安全 1、读写cookie: request.COOKIES def show_color(request): if "favorite_color" in request.COOKIES: return HttpResponse("Your favorite color is %s" % request.COOKIES["favorite_color"]) else: return HttpResponse("You don't have a favorite color.")
用户5760343
2022/05/14
5040
Django2.0中文(会话、用户、注册)
如何在 Python 中将数字转换为字母?
在编程中,有时我们需要将数字转换为字母,例如将数字表示的年份转换为对应的字母表示,或者将数字编码转换为字母字符。Python 提供了多种方法来实现这种转换。本文将详细介绍在 Python 中将数字转换为字母的几种常用方法,并提供示例代码帮助你理解和应用这些方法。
网络技术联盟站
2023/06/01
1.9K0
聊聊如何在K8S中实现会话保持
故事的起因是朋友所在的部门最近基于auth2实现单点登录,他们在测试环境单点登录,运行得好好的,但他们把单点登录上到预发布环境,发现单点登录不好使了。他们有部分系统是以授权码式接入,发现第一次登录拿到授权码进行换取token时,会提示授权码失效。而他们测试环境和预发布环境的代码是一样的。
lyb-geek
2023/03/14
1.4K0
聊聊如何在K8S中实现会话保持
如何在js中将统计代码图标隐藏
  建站时我们都会加一下网站统计,方便把控内容的内容的运营。大部分站长安装的站点统计是第三方统计代码,js形式的,很少用以服务器日志为基础分析的统计。(当然能通过网站日志来分析网站的运营者比一般的站长水平相对要高一些,也更会折腾。因为很多统计都没记录蜘蛛的轨迹)普通的js统计代码就能满足大多数的需求。安装统计代码想必大家闭着眼睛都会,但如果网站是静态页面的话,那每个页面都要添加到,即使安装在统一调用的页脚,那生成页面也需要一定的时间。有没更便捷的办法呢?将统计代码写进常用的js文件中。   将统计代码写进j
ytkah
2018/03/05
13.5K0
如何在js中将统计代码图标隐藏
如何在 .Net 7 中将 Query 绑定到数组
在 .Net 7 中,我们可以通过绑定数组的方式来接收来自查询字符串的参数。这样就不需要再使用逗号分隔的字符串来获取参数了。
newbe36524
2023/08/23
1440
将爬取的数据保存到mysql中
      create database scrapy (我新建的数据库名称为scrapy)
py3study
2020/01/19
3.7K0
如何在Python中将字典键作为列表返回?
参考链接: Python字典keys() 本文翻译自:How to return dictionary keys as a list in Python?  In Python 2.7 , I cou
用户7886150
2021/01/25
2.1K0
如何在Python中将列表转换为字符串?
Python provides different variable type for programmers usage. We can use int, float, string, list, set … data types in our applications. While using different type of variables we may need to convert then to different types. In this tutorial we will different type of conversion from list to string in Python.
全栈程序员站长
2022/08/12
4.6K0
等保升级行业用户如何选择?
等级保护制度在1994年被首次提出。2007年发布等保1.0,2017年发表了《网络安全法》。2019年实施了等保2.0的新标准。从这个过程来看,我们可以判断不等保一定程度上是违反了国家法律。
企商在线
2021/08/09
8140
等保升级行业用户如何选择?
TRICONEX D06603 生产数据保存到文件中
安全集成服务器(SIS)提供一个高性能的OPC UA数据集成层,使实现尽可能灵活。基于OPC UA聚合服务器的几个OPC UA服务器在自动化级别与相关联的地址空间相结合,并且通过稳定的OPC UA接口将数据提供给IT应用。SIS涵盖了OPC UA安全功能的全部范围,并支持实施最先进的安全解决方案。
用户10384942
2023/04/26
3240
TRICONEX  D06603 生产数据保存到文件中
如何在linux中列出所有用户
列出所有Linux用户的两种方法 使用 /etc/passwd 文件列出 Linux 中的所有用户 本地用户的详细信息可以在/etc/passwd文件中找到。文件中包含的每一行都包含一个用户的信息。 有两种选择。 通过键入以下命令打开etc/passwd文件: cat etc/passwd 或者,你可以使用以下less命令: less etc/passwd 注意:要显示登录用户列表以及引导时间、进程、主机名等信息,请使用who 命令。 使用getent命令列出所有Linux用户 /etc/nsswitch.
入门笔记
2022/06/02
9.2K0
如何在linux中列出所有用户
如何在Linux中检查MySQL用户权限?
因此,对于任何需要访问 MySQL 数据库以通过 root 用户凭据获得访问权限的用户来说,它并不理想,根用户访问权限应保留给数据库管理员,然后他们将使用根用户凭据创建数据库用户并授予执行不同数据库查询的权限。
网络技术联盟站
2023/03/13
6.5K0
如何在Linux中检查MySQL用户权限?
如何在Linux中更改用户ID?
在Linux系统中,每个用户都有一个唯一的用户ID(User ID),用于标识和管理用户的权限和资源访问。有时候,我们需要更改用户ID,可能是为了解决冲突、重组用户组或其他管理需求。本文将详细介绍如何在Linux中更改用户ID的几种方法。
网络技术联盟站
2023/06/08
8.5K0
如何在Linux中更改用户ID?
会话管理技术实战(用户登录案例)
[1].创建一个User类,封装用户名和密码。 [2].提供一个首页面,欢迎用户登录:IndexServlet,提供一个退出的链接。 [3].提供一个登录的Servlet:处理登录请求。 [4].提供一个退出的Servlet:处理退出首页面的功能。
别团等shy哥发育
2023/02/27
4150
会话管理技术实战(用户登录案例)
远程多用户多会话配置
不是刚需不要开启!!!如何开启往下看。(出了安全问题本人不负责,下面的文档不论哪里的都是介绍如何安装,安全风险需要自担)
Windows技术交流
2021/06/15
4.8K0
如何在 Bash 中将字符串计算为数字?
当您尝试在 bash 中进行算术运算时,这会产生问题,您尝试添加的数字会给您带来奇怪的结果。
网络技术联盟站
2022/04/21
1.5K0
如何在 Bash 中将字符串计算为数字?
如何在 Go 中将 []byte 转换为 io.Reader?
在 stackoverflow 上看到一个问题,题主进行了一个网络请求,接口返回的是 []byte。如果想要将其转换成 io.Reader,需要怎么做呢?
AlwaysBeta
2021/12/29
2.4K0
如何在 Linux 中将 CSV 文件转换为 TSV 文件?
在Linux操作系统中,可以使用各种命令和工具来处理和转换文本文件。当需要将以逗号分隔的CSV文件转换为以制表符分隔的TSV文件时,可以使用一些简单的命令和技巧来实现。本文将详细介绍如何在Linux中将CSV文件转换为TSV文件。
网络技术联盟站
2023/06/20
1.1K0
如何在 Linux 中将 CSV 文件转换为 TSV 文件?
点击加载更多

相似问题

PhoneAuth Firebase:更新电话号码

12

Xamarin Firebase PhoneAuth

10

Flutter firebase phoneAuth问题

131

是否可以将PhoneAuth链接到Firebase中的现有用户帐户?

18

firebase在创建用户时出现nodejs错误:

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文