加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 无法转换通用对象

发布时间:2020-12-15 08:15:08 所属栏目:百科 来源:网络整理
导读:我有以下概念模型: public interface IFooout T{ T Data { get; }}public struct FooT : IFooT{ public Foo(T data) : this() { Data = data; } public T Data { get; private set; }}public class FooServiceT { ... public FooT Get(string id) { ... }}
我有以下概念模型:
public interface IFoo<out T>
{
    T Data { get; }
}

public struct Foo<T> : IFoo<T>
{
    public Foo(T data) : this()
    {
        Data = data;
    }

    public T Data { get; private set; }
}

public class FooService<T> 
{
    ...

    public Foo<T> Get(string id)
    {
        ...
    }
}

然后我尝试以一种概念上等同于此的方式使用它:

// Create and register a few FooService instances
ServiceLocator.Register(new FooService<DateTime>(),"someServiceId");
ServiceLocator.Register(new FooService<double?>(),"anotherServiceId");

// Retrieve a particular FooService instance and call the Get method
var fooService = (FooService<object>)ServiceLocator.Get("someServiceId");
var foo = fooService.Get("someFooId");

我想在FooService实例上使用Get()方法 – 无论选择的FooService实例返回什么类型.但是,此代码导致以下异常:

Unable to cast object of type ‘WindowsFormsApplication7.FooService`1[System.DateTime]’ to type ‘WindowsFormsApplication7.FooService`1[System.Object]’.

任何关于如何解决这个问题的建议都会受到高度赞赏.

你可能会争辩,为什么我首先制作了FooService泛型.但是,这样做是为了在类型安全的环境中确保类型安全.但是,在这种特殊情况下,FooService应该在Web API控制器中用于服务各种类型的Foo.无论T的类型如何,它都应返回T的Foo响应.

解决方法

我想你已经给出了正确答案:

FooService接口<加倍>永远不能被转换为FooService< object>,和
FooService接口< DateTime的>永远不能被转换为FooService< object>.

使用协方差或逆变不会改变这一点.页面https://msdn.microsoft.com/en-us/library/dd997386.aspx声明:值类型也不支持方差.既然加倍?和DateTime是值类型,这永远不会工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读