将返回值转换为泛型类型

fog*_*fog 9 c# generics

假设我们有一个带有单个泛型方法的接口:

public interface IExtender
{
    T GetValue<T>(string tag);
}
Run Code Online (Sandbox Code Playgroud)

以及一个简单的实现A,它根据"tag"参数返回两种不同类型(B和C)的实例:

public class A : IExtender
{
    public T GetValue<T>(string tag)
    {
        if (typeof(T) == typeof(B) && tag == null)
            return (T)(object) new B();
        if (typeof(T) == typeof(C) && tag == "foo")
            return (T)(object) new C();
        return default(T);
    }
}
Run Code Online (Sandbox Code Playgroud)

有可能避免双重演员(T)(object)吗?或者,有没有办法告诉编译器"嘿,我确信这个演员阵容不会在运行时失败,只是让我在没有首先投射到对象的情况下执行它!"

Jon*_*eet 7

或者,有没有办法告诉编译器"嘿,我确信这个演员阵容不会在运行时失败,只是让我在没有首先投射到对象的情况下执行它!"

不,这种语言是故意设计的,以防止这种情况发生.Eric Lippert 最近在博客上发表了这篇文章.我同意这很烦人,但它确实有一定道理.

说实话,像这样的"通用"方法通常有点像设计气味.如果方法必须针对各种不同类型具有特殊情况,则至少应考虑使用单独的方法.(GetB,GetC)


Tom*_*sup 5

public T MyMethod<T>(string tag) where T : class
    {
        return new A() as T;
    }
Run Code Online (Sandbox Code Playgroud)