Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#泛型方法,可以从泛型类型'推断参数的类型;s类型定义?_C#_.net_Generics - Fatal编程技术网

C#泛型方法,可以从泛型类型'推断参数的类型;s类型定义?

C#泛型方法,可以从泛型类型'推断参数的类型;s类型定义?,c#,.net,generics,C#,.net,Generics,有没有办法让以下(非编译)代码运行?我还没有找到解决办法 public class Factory{ public static T Get<T>(V v) where T : BaseClass<V> { T someObject = DIContainer.Resolve<T>(); someObject.Set(v); } } 公共类工厂{ 公共静态T Get(V) 其中T

有没有办法让以下(非编译)代码运行?我还没有找到解决办法

public class Factory{
    public static T Get<T>(V v)
        where T : BaseClass<V> {
            T someObject = DIContainer.Resolve<T>();
            someObject.Set(v);
    }
}
公共类工厂{
公共静态T Get(V)
其中T:BaseClass{
T someObject=DIContainer.Resolve();
someObject.Set(v);
}
}
T是一个普通泛型类型参数,用于定义泛型方法“Get”,但有一个包含泛型本身的类型约束。 现在,该方法应该定义一个参数,其类型由该方法的泛型类型参数定义的泛型类型参数定义。
基类将定义接收其泛型类型参数类型的参数的方法集。
这意味着应该可以调用
Factory.Get(someObjectCastableToB)

它可以通过在V上定义另一个约束的方法Get as Get来工作。但是调用将是
Factory.Get(..)
,这并不像B的声明有两次那么好


谢谢

< P>不同于C++模板,在那里你可以拥有或,C类泛型参数只能在声明站点中深入一个,而泛型约束只能告诉你关于宗族的内容。如果您希望能够引用其中一个泛型参数的泛型参数,唯一的方法是,正如您在示例中所做的那样,通过继承沿袭上的泛型约束(
T:BaseClass
),然后还必须在泛型签名中标识V。你需要像下面这样的东西

public class Factory{
    public static T Get<T, V>(V v)
        where T : BaseClass<V> {
            T someObject = DIContainer.Resolve<T>();
            someObject.Set(v);
    }
}
公共类工厂{
公共静态T Get(V)
其中T:BaseClass{
T someObject=DIContainer.Resolve();
someObject.Set(v);
}
}
我在这里添加的只是方法签名的泛型参数V。同样,如果您没有锚定V的基类,您将无法对您的情况做很多事情。例如,如果T的运行时类型本身是泛型的,而不是它的基类,那么您将被卡住,如下面的示例所示,这将而不是编译

public class Factory{
    public static T Get<T, V>(V v)
        where T : T<V> {
            T someObject = DIContainer.Resolve<T>();
            someObject.Set(v);
    }
}
公共类工厂{
公共静态T Get(V)
T:T在哪里{
T someObject=DIContainer.Resolve();
someObject.Set(v);
}
}

您的代码片段中定义了
V
在哪里?不太清楚。必须以某种方式处理V的类型,因此我看不出有任何方法将其作为通用参数。但是,由于您已经对T有了一个约束,它将T定义为基类,所以我认为您的调用不会像您担心的那样糟糕。我同意Get(…)看起来有点难看,但我看不出有任何理由它不能仅仅是Get(…)where t:BaseClass。我不知道这是否是你想要的答案。我得出了相同的结论。实例: