为什么编译器无法推断出我的泛型类型? (但是智能感知可以)

问题描述 投票:0回答:1

我有这个通用类

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#不推断我的泛型类型?为什么不能推断这些泛型类型参数?。所以我不认为这是重复的。

c# generics type-inference
1个回答
0
投票

在这种用法中,编译器必须知道会出现哪种类型。您应该使用

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.