Convarivariance / Covariance-无法将类转换为接口

问题描述 投票:0回答:2

我有以下代码

public interface IInterface
{
}
public class GenericClass<TSomeClass>
    where TSomeClass : class
{
    public TSomeClass SomeMethod(TSomeClass someClass = null)
    {
        return SomeClass.SomeClassStaticInstance;                   //ERROR:Cannot implicitly convert type 'SomeClass' to 'TSomeClass'
        return (TSomeClass)SomeClass.SomeClassStaticInstance;       //ERROR:Cannot convert type 'SomeClass' to 'TSomeClass'
        return SomeClass.SomeClassStaticInstance as TSomeClass;     //Works when "where TSomeClass : class" clause added
    }
}
public class SomeClass : IInterface
{
    public static SomeClass SomeClassStaticInstance = new SomeClass();
}

它会在相应行的注释中生成编译时错误。

我想知道为什么我不能只使用产生错误的第一行? SomeClass实现了IInterface,但我不得不弄乱as关键字。

我已经尝试将GenericClass<TSomeClass>更改为GenericClass<out TSomeClass>,但是即使我删除了Only interface and delegate type parameters can be specified as variant.子句,我仍然遇到另一个编译时错误where TSomeClass : class,该错误仍然存​​在。

我想念的是什么……显然很有效,因为我可以使用where TSomeClass : class子句和return SomeClass.SomeClassStaticInstance as TSomeClass;语句将其“强制”!

我实际上确实需要where TSomeClass : class,否则我会收到TSomeClass someClass = null ... A value of type '<null>' cannot be used as a default parameter because there are no standard conversions to type 'TSomeClass'的另一个编译时错误。

所以基本上是从头到尾编译时间错误!谢谢。

我有以下代码公共接口IInterface {}公共类GenericClass 其中TSomeClass:类{公共TSomeClass SomeMethod(TSomeClass someClass = null){...

c# .net generics covariance contravariance
2个回答
0
投票

您尚未指定强制执行TSomeClass来实现IInterface的通用类型约束:


-1
投票

您需要将返回类型从类更改为接口

© www.soinside.com 2019 - 2024. All rights reserved.