我试图了解泛型类型。但是,我觉得我对假货感到困惑。
在我的系统上,我想加载一些东西。它并不重要,它可能是任何东西。来电者会知道它是什么。
我的方法是使用界面,界面只是
public interface ILoad
{
void Load<T>(T t);
}
在我的Bll课程中,我有一个方法
public void Start(ILoad load)
{
load.Load<Survey>(this); // I'm telling it the type and passing it the object
}
public class FakeLoadForSurvey : ILoad //this class knows about Survey
{
public void Load<T>(T t)
{
t = new Survey(); //fails
{
}
失败并显示以下错误消息
不能将类型调查转换为T
我希望上面的例子足够清楚。
如何告诉C#T
类型为Survey
(或任何其他类型)?
答案 0 :(得分:7)
Tensor("conv2d_24/Tanh:0", shape=(1, 4, 5, 1), dtype=float32)
如果实现接口的类知道public class FakeLoadForSurvey : ILoad //this class knows about Survey
的类型,则将T
移动到接口:
T
请注意,这不会影响传递给public interface ILoad<T>
{
void Load(T t);
}
public class FakeLoadForSurvey : ILoad<Survey>
{
public void Load(Survey t)
{
t = new Survey();
}
}
的参数。
因此,如果某些代码像这样调用它:
Load()
var surveyLoader = new FakeLoadForSurvey();
Survey surveyToLoad = null;
surveyLoader.Load(surveyLoader);
返回后,surveyToLoad
仍为null
。如果您不想要,请将其传递给Load()
。
答案 1 :(得分:2)
从设计的角度来看,此代码看起来很糟糕,因为您将泛型与静态定义的类型混合在一起。如果你使用泛型,你应该一路走下去:
public interface ILoad
{
void Load<T>(T t) where T : new();
}
public class FakeLoadForSurvey : ILoad
{
public void Load<T>(T t) where T : new()
{
t = new T();
}
}
我不确定您对您定义的参数的意图是什么,但是在方法之后它会失去范围,因此t
永远不会在Load<T>
方法之外使用。
答案 2 :(得分:-1)
public void Load<T>(T t) where T: Survey, new()
{
t = (T) new Survey(); // should succeed
}
但是如果参数void
返回且参数没有ref
,则此函数仍然无法执行任何有用的操作。