C#通用接口类型推理问题
本文关键字:推理 问题 接口类型 | 更新日期: 2023-09-27 17:58:40
如果不举个例子,我不知道如何简洁地表达这个问题,所以下面是:
public interface IThing<T>
{
void Do(T obj);
}
public class ThingOne : IThing<int>
{
public void Do(int obj)
{
}
}
public class ThingTwo : IThing<string>
{
public void Do(string obj)
{
}
}
public class ThingFactory
{
public IThing<T> Create<T>(string param)
{
if (param.Equals("one"))
return (IThing<T>)new ThingOne();
if (param.Equals("two"))
return (IThing<T>)new ThingTwo();
}
}
class Program
{
static void Main(string[] args)
{
var f = new ThingFactory();
// any way we can get the compiler to infer IThing<int> ?
var thing = f.Create("one");
}
}
问题似乎就在这里:
// any way we can get the compiler to infer IThing<int> ?
var thing = f.Create("one");
没有。您需要明确指定类型:
var thing = f.Create<int>("one");
如果没有在方法中专门使用的参数,就无法推断返回类型。编译器使用传递给方法的参数来推断类型T
,在这种情况下,它是一个单独的字符串参数,没有类型T
的参数。因此,没有办法为你推断出这一点。
不,不能这样做,因为Create
工厂方法的结果将在运行时根据参数的值进行评估。泛型是为了编译时的安全,在您的情况下,您不能具有这样的安全性,因为参数值只有在运行时才知道。