c# – 泛型上的InvalidCastException
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 泛型上的InvalidCastException,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2572字,纯文字阅读大概需要4分钟。
内容图文
来自Java世界,使用泛型和C#进行编程通常是一个令人头疼的问题.像这个:
interface ISomeObject { }
class SomeObjectA : ISomeObject { }
class SomeObjectB : ISomeObject { }
interface ISomething<T> where T : ISomeObject
{
T GetObject();
}
class SomethingA : ISomething<SomeObjectA>
{
public SomeObjectA GetObject() { return new SomeObjectA(); }
}
class SomethingB : ISomething<SomeObjectB>
{
public SomeObjectB GetObject() { return new SomeObjectB(); }
}
class SomeContainer
{
private ISomething<ISomeObject> Something;
public void SetSomething<T>(ISomething<T> s) where T : ISomeObject
{
Something = (ISomething<ISomeObject>)s;
}
}
class TestContainerSomething
{
static public void Test()
{
SomeContainer Container = new SomeContainer();
Container.SetSomething<SomeObjectA>(new SomethingA());
}
}
这导致在Something =(ISomething< ISomeObject>)s;的InvalidCastException.在Java中,这可以工作,我甚至可以使用(如果所有其他方法都失败)泛型通配符<?>.这在C#中是不可能的.
虽然这只是我用来解释问题的一个例子,但如何消除这种异常呢?唯一的主要约束是SomeContainer不能是泛型类
**注意**:关于这个问题有很多问题,但是没有一个(我能找到)解决非泛型类中的泛型类成员.
**更新**
在方法SetSomething中,我添加了以下行:
Console.WriteLine(s.GetType().IsSubclassOf(typeof(ISomething<SomeObjectA>)));
Console.WriteLine(s.GetType().ToString() + " : " + s.GetType().BaseType.ToString());
foreach (var i in s.GetType().GetInterfaces())
{
Console.WriteLine(i.ToString());
}
令我惊讶的输出
False
SomeThingA : System.Object
ISomething`1[SomeObjectA]
这是我得到这个例外的原因吗?
解决方法:
如果你的ISomething只有返回T的方法,那么Out关键字将是一个修复
interface ISomething<out T> where T : ISomeObject
在创建通用接口时,您可以指定在具有不同类型参数的接口实例之间是否存在隐式转换.
它被称为Covariance and Contravariance
Eric Lippert有一个很好的series of articles为什么我们需要考虑这个,这里使用interface variance
这是我的代码,它对我来说是预期的
interface ISomeObject { }
class SomeObjectA : ISomeObject { }
class SomeObjectB : ISomeObject { }
interface ISomething<out T> where T : ISomeObject
{
T GetObject();
}
class SomethingA : ISomething<SomeObjectA>
{
public SomeObjectA GetObject() { return new SomeObjectA(); }
}
class SomethingB : ISomething<SomeObjectB>
{
public SomeObjectB GetObject() { return new SomeObjectB(); }
}
class SomeContainer
{
private ISomething<ISomeObject> Something;
public void SetSomething<T>(ISomething<T> s) where T : ISomeObject
{
Something = (ISomething<ISomeObject>)s;
}
}
class TestContainerSomething
{
static public void Test()
{
SomeContainer Container = new SomeContainer();
Container.SetSomething<SomeObjectA>(new SomethingA());
}
}
内容总结
以上是互联网集市为您收集整理的c# – 泛型上的InvalidCastException全部内容,希望文章能够帮你解决c# – 泛型上的InvalidCastException所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。