从T铸造有什么问题?

时间:2018-03-15 13:20:47

标签: c# generics casting

这是我的code

public class Program
{
    public static void Main(string[] args)
    {
        Factory factory = new Factory();
    }           
}     

public class Factory
{
    public Factory() {
        Animal animal = new Animal();
        MVCSender<Animal>(animal);                  
    }    

    public void MVCSender<T>(object elem) {
        WebAPIReceiver<T>(elem);
    }   

    public void WebAPIReceiver<T>(object elem) {
        WebAPIProcesser((T)elem);
    }

    public void WebAPIProcesser(Animal elem) {
        elem.Speak();
    } 
}  

public class Animal
{
    public Animal() {}

    public void Speak()
    {
        Console.WriteLine("Animal Speak!");
    } 
}  

我在函数之间传递T,在“端点”上,我尝试使用我传递过函数的object类型来转换泛型T类型。

这是一个自学问题,整体没有任何意义。

  1. 为什么我不能从WebAPIProcesser((T)elem)投放AnimalT
  2. 在C#中写泛型(在函数名之后)是什么意思?它是否只是在任何函数声明之前替换template <class T>(例如在C++上)?

2 个答案:

答案 0 :(得分:4)

public void WebAPIReceiver<T>(object elem) {
    WebAPIProcesser((T)elem);
}

与C ++模板相比,只有当您实际执行时,它们才会失败,C#会确保 的任何调用必须是合法的。

在您的情况下:虽然您的案例中的T Animal,但编译器必须确保您的方法适用于任何 { {1}}。它没有。对于任何非T,它都会失败。所以编译器会给你一个错误。

答案 1 :(得分:0)

  

如果你回答我的答案,你告诉我如何转换   从模板T到字符串(即推断Animal到string&#34; Animal&#34;)你   会得到我的接受&#34;解答!

void Main()
{
    Foo<Animal> foo = new Foo<Animal>();
    Animal animal = new Animal();
    Console.Write(foo.Get(animal));
}

public class Animal
{
}

public class Foo<T> {

    public string Get(T entity)
    {
        return entity.GetType().Name;
    }
}