在C#generic中传递“this”在没有强制转换的情况下无效
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在C#generic中传递“this”在没有强制转换的情况下无效,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2257字,纯文字阅读大概需要4分钟。
内容图文
![在C#generic中传递“this”在没有强制转换的情况下无效](/upload/InfoBanner/zyjiaocheng/754/6f240cbf7a2d47d595f8494d38d835ad.jpg)
我尝试使用谷歌搜索和stackoverflow但无法找到我的具体问题的答案(甚至有限的geneics知识)
所以我发布在这里希望得到答案.
这是我的课
public abstract class AThemeableControl<TManager, TControl>
where TManager:AManagerTheme<TManager, TControl>
where TControl:AThemeableControl<TManager, TControl>
{
public abstract void UpdateTheme(TManager managerTheme);
}
这是经理班
public abstract class AManagerTheme<TManager, TControl>
where TManager:AManagerTheme<TManager, TControl>
where TControl:AThemeableControl<TManager, TControl>
{
public TControl[] ThemableControls;
virtual public void ApplyTheme()
{
for (int i = ThemableControls.Length-1; i >= 0; i--)
{
ThemableControls[i].UpdateTheme(this); //ERROR HERE
}
}
}
所以我能够通过类型转换来解决这个错误
ThemableControls[i].UpdateTheme((TManager) this);
但我想知道没有类型转换的解决方案,我希望是可能的.
解决方法:
你不能删除演员,因为这样做是不安全的.这是一个投掷抛出的例子:
using System;
public abstract class AManagerTheme<TManager, TControl>
where TManager : AManagerTheme<TManager, TControl>
where TControl : AThemeableControl<TManager, TControl>
{
public TControl[] ThemableControls;
public virtual void ApplyTheme()
{
for (int i = ThemableControls.Length - 1; i >= 0; i--)
{
ThemableControls[i].UpdateTheme((TManager) this);
}
}
}
public abstract class AThemeableControl<TManager, TControl>
where TManager : AManagerTheme<TManager, TControl>
where TControl : AThemeableControl<TManager, TControl>
{
// Empty implementation; irrelevant for the question.
public void UpdateTheme(TManager managerTheme) {}
}
public class NormalTheme : AManagerTheme<NormalTheme, NormalControl>
{
}
public class NormalControl : AThemeableControl<NormalTheme, NormalControl>
{
}
public class EvilTheme : AManagerTheme<NormalTheme, NormalControl>
{
}
public class Test
{
static void Main()
{
var theme = new EvilTheme
{
ThemableControls = new[] { new NormalControl() }
};
theme.ApplyTheme();
}
}
这是你想要阻止的:
public class EvilTheme : AManagerTheme<NormalTheme, NormalControl>
…但你无法用C#泛型来表达这一点. (我在早期版本的Protocol Buffers中遇到了同样的问题,其中每个“消息”类型都有相应的“构建器”类型.)C#类型系统不够丰富,无法表达这一点.
您可能希望在抽象类构造函数中检查有效性,以便至少您知道转换将在以后工作.但你无法避免在某处投射或使用不同的TManager.
内容总结
以上是互联网集市为您收集整理的在C#generic中传递“this”在没有强制转换的情况下无效全部内容,希望文章能够帮你解决在C#generic中传递“this”在没有强制转换的情况下无效所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。