从封闭构造类型继承的C#具体类

时间:2018-07-29 07:29:48

标签: c# generics inheritance

我有一个Generic interface声明Generic Method如下。

 public interface BaseInterface<T> where T: class
    {
        //This will not generate the compile time
        //warning that the type parameter of method is same as interface
        U Method1<U>(U u) where U : T;

    }

现在,我定义一个新的Concrete类,继承上述接口的closed constructed type

public class DerivedClass : BaseInterface<string>
    {

        U BaseInterface<string>.Method1<U>(U u)
        {
            return "Some String";
        }
    }

在界面中,我将类型参数U的约束用作where U : T。我还使用了T is string的封闭构造类型。因此,在DerivedClass中,为什么编译器不让我返回string

错误

  

错误CS0266无法将类型'string'隐式转换为'U'。存在显式转换(您是否缺少演员表?)GenericPractice

2 个答案:

答案 0 :(得分:0)

出现错误的原因是因为编译器没有检查指定为T的类是否是密封的,然后才意识到由于U:T意味着U必须为T。如果T不是密封的,则代码永远无法工作,因为任何类都可以继承T,并且没有代码您就无法在派生类型之间进行转换。

但是根据您的评论,我认为您可能只是在寻找以下内容:

public interface BaseInterface<T> where T: class
{
    T Method1<U>(U u) where U : T;
}

public class DerivedClass : BaseInterface<string>
{
    string BaseInterface<string>.Method1<U>(U u)
    {
        return "Some String";
    }
}

请在以下位置查看上面的代码: https://dotnetfiddle.net/aARD4W

答案 1 :(得分:0)

为什么不简单地这样做呢?由于在您的代码中,UT

public interface BaseInterface<T> where T : class
{
    T Method1(T u);
}

public class DerivedClass : BaseInterface<string>
{
    public string Method1(string u)
    {
        return "Some String";
    }
}

您不需要where U : T,因为您可以只使用T,并且由于UT,因此Method1既不需要通用,因为我们知道它将返回/需要哪种类型。

在此处进行测试:https://dotnetfiddle.net/yFyZtc