我有这个通用类
public class SomeClass<TA>{
public SomeClass(Func<IList<TA> myFunc){...}
public OtherClass<TA, TM> CreateOther<TM>(Func<TA, Func<TM>> func) {...}
当我调用
CreateOther
方法时,我必须明确指定 TM
。否则,代码不会编译并显示“无法从使用中推断出类型参数”。
mySomeClass.CreateOther<string>(a=>a.GiveString)
//with
public class StringGiver{
public string GiveString() => "Hello";
}
//and
var creatorFunc = ()=> new List<StringGiver> {new ()};
var mySomeClass = new MySomeClass(creatorFunc);
根据我的理解,应该可以从
GiveString
的返回类型推断出TM。事实上,当我编写上面的行时,<string>
部分将被我的 Intellisense/ReSharper 变灰,并提示“类型参数规范是多余的”。
我不依赖像这里类似的推断泛型类型问题这样的约束为什么C#不推断我的泛型类型?为什么不能推断这些泛型类型参数?。所以我不认为这是重复的。
在这种用法中,编译器必须知道会出现哪种类型。您应该使用
class
或您的限制类型。
public class OtherClass<TA, TM> where TM : class {
}
然后使用它。
public OtherClass<TA, TM> CreateOther<TM>(Func<TA, Func<TM>> func) where TM : class {
//return default;
}