【问题标题】:Why types are not inferred from type constraints in C#? [closed]为什么不能从 C# 中的类型约束推断类型? [关闭]
【发布时间】: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#


【解决方案1】:

为什么 C# 类型系统不允许简洁表达式:var foo = new Foo().Bar()

其中一个原因是T 不一定是string,如下图所示:

public class Foo : IFoo<string>, IFoo<int> { }

类型必须能够在 100% 的情况下被推断,否则需要明确。

【讨论】:

  • 嗯,但这不是 Foo 的定义方式。在这种情况下,我理解类型是模棱两可的。一切对编译器都是透明的。还是我错过了什么?
  • @JohnathanBarclay 添加接口已经是一项重大更改此功能是否存在。即使使用现在的语言,您也可以构建添加接口导致先前编译代码错误或行为不同的情况(重载解决方案是最好的例子)。
  • @Servy 是的,你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多