我有一个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
答案 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)
为什么不简单地这样做呢?由于在您的代码中,U
是T
。
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
,并且由于U
是T
,因此Method1
既不需要通用,因为我们知道它将返回/需要哪种类型。
在此处进行测试:https://dotnetfiddle.net/yFyZtc