【问题标题】:The type arguments for method 'xyz' cannot be inferred from the usage无法从用法中推断方法“xyz”的类型参数
【发布时间】:2018-07-03 18:09:29
【问题描述】:

早安,

我已经在 google 和 stackoverflow 上搜索了一段时间,但还没有得到答案。 (至少不是我想要的答案:))

所以,下面是我的底层代码的一个简单示例:

public interface IITem<IdType>
{
    IdType Id { get; set; }
}

public class Item<IdType> : IITem<IdType>
{
    public IdType Id { get; set; }
}    

public class MyItem : Item<Guid>
{
}

现在,我想创建一个通用的 ID getter,如下所示:

private static TId GetId<TItem, TId>(TItem e) where TItem : IITem<TId>
{
    return e.Id;
}

到目前为止还不错,但是现在,当我想像下一个示例一样使用它时,我收到标题中提到的错误:

var item = new MyItem()
{
    Id = Guid.NewGuid()
};
var id = GetId(item);

它确实有效,当我明确地说出它的所有类型时:

var id = GetId<MyItem, Guid>(item);

但我不想命名我的项目,更不用说 ID 类型(在 MyItem 中定义,在 GetId() 使用范围内无法直接看到),这对于某些对象可能完全不同。

我是否可以进行任何类型的语法修复,以便在不提示任何类型的情况下让这个 GetId() 正常工作?

谢谢!

【问题讨论】:

    标签: c# generics inheritance interface


    【解决方案1】:

    通用约束对GetId 有什么作用?

    直接使用泛型接口类型即可:

    private static TId GetId<TId>(IITem<TId> e)
    {
        return e.Id;
    }
    

    【讨论】:

    • 这是一个更大项目的一部分。我剥离了代码,只将实际问题留在示例中。不过谢谢!看来我是想多了,涉及的类型太多了。似乎工作得很好!
    • 很高兴为您提供帮助。有关忽略泛型约束的 C# 类型推断器的另一个问题,请参阅 stackoverflow.com/a/8511493/3140
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多