不能将T的对象强制转换为具体类型

时间:2018-06-11 12:40:36

标签: c# generics

我试图了解泛型类型。但是,我觉得我对假货感到困惑。

在我的系统上,我想加载一些东西。它并不重要,它可能是任何东西。来电者会知道它是什么。

我的方法是使用界面,界面只是

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(或任何其他类型)?

3 个答案:

答案 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,则此函数仍然无法执行任何有用的操作。