【发布时间】:2020-11-06 00:46:33
【问题描述】:
考虑以下短程序:
public interface IFoo<T> {}
public class Foo : IFoo<string> {}
public static class ExtensionFoo
{
public static TFoo Bar<TFoo, T>(this TFoo foo)
where TFoo : IFoo<T>
{
System.Console.WriteLine($"I never got to know what is {default(T)}");
return foo;
}
}
public class Program
{
public static void Main()
{
// Error, types can not be inferred for some reason
var foo = new Foo().Bar();
// Working, but redundant
// var foo = new Foo().Bar<Foo,string>();
// Error, as expected
// var foo = new Foo().Bar<Foo,int>();
}
}
为什么 C# 类型系统不允许简洁的表达式:var foo = new Foo().Bar()?
在这样的表达式中无法解析类型是否有深层次的原因?
一般情况下是否可以避免在这种流畅的组合中弹出类型?
这是在 .Net Core 3.1 上测试的。
【问题讨论】:
-
为什么,因为它没有。我不确定您期望在这里得到什么答案?这就是编译器的设计方式。泛型的隐式解析是/只是简略
-
我猜,你需要这个问题的答案Why doesn't C# infer my generic types? 编译器不会根据返回类型推断泛型类型
-
问题是扩展方法在静态上下文中运行,因此类型不会转移到扩展方法,所以我想说这不是限制,它是一个特性!
-
如果它不是一个错误(而且它不是),那么根据定义它一定是故意的。
-
@RandRandom 您关于语言开发人员应该公开解释他们为什么设计各种语言功能的断言与关于为什么一种语言的设计方式应该成为主题的问题无关这里。语言设计师发布他们的设计决策推理非常棒。但是,如果您想问语言设计师为什么他们选择做某事,您需要问他们,而不是在 SO 上询问无法提供此类答案的用户。
标签: c#