【发布时间】:2018-11-12 19:56:54
【问题描述】:
我正在尝试在具有泛型返回类型的接口中创建一个方法,但我未能将泛型转换为特定类型/类。但是,如果我将泛型放在接口上而不是方法上,我就可以进行强制转换。
换句话说,为什么会这样
public class Rain {
public string propA {get;set;}
}
public interface IFoo<T> {
T foo();
}
public class Bar : IFoo<Rain> {
Rain foo() {
//...
return new Rain();
}
}
public bar = new Bar();
Rain rain = bar.foo();
但这不可能吗?
public class Rain {
public string propA {get;set;}
}
public interface IFoo {
T foo<T>();
}
public class Bar : IFoo {
T foo<T>() {
//...
return new Rain();
}
}
public bar = new Bar();
Rain rain = bar.foo<Rain>();
还有其他方法吗(不使用Convert.ChangeType())?
【问题讨论】:
-
在你的第二个版本中,你声明 Foo 返回 T 类型的东西——类型可以是任何东西。但是在调用 Foo 并传递类型 T 时,它必须返回 T 类型的东西,但你总是返回 Rain。本质上就是说你要返回一个字符串但返回一个int,当然它不会编译
-
为了帮助加深您的误解,想象一下如果您的第二个代码示例是
public bar = new Bar(); Bobby rain = bar.foo<Bobby>();,您期望编译器会做什么。现在,编译器要做的唯一合理的事情就是说“不,我不能那样做”。因此,它必须始终这样说 - 无论您是否将Bobby替换为Rain。