我有这样的代码:

using System;
using System.Collections.Generic;
using System.Linq;

public interface IMyString
{
    string Id {get;set;}
};

public class MyString : IMyString
{
    public string Id {get;set;}
}

public static class Extensions
{
    public static IEnumerable<IMyString> WithId(this IEnumerable<IMyString> source, string id)
    {
        return source.Where(x => x.Id == id);
    }
}

public class Program
{
    private static List<T> GetMyStrings<T>(string key, List<T> input)
        where T: IMyString
    {
        return input.WithId(key).ToList();
    }

    public static void Main()
    {
        var foo = new List<MyString>{ new MyString { Id = "yes"}, new MyString { Id = "no" } };
        var result = GetMyStrings("yes", foo);
        var result2 = foo.WithId("no");
        Console.WriteLine(result2);
    }
}


为什么input.WithId(key).ToList()可以,为什么foo.WithId("no")会导致语法错误?有没有办法使方法GetMyStrings工作?

最佳答案

这里的问题是,只要WithId()是非泛型的,那么它只能返回IEnumerable<IMyString>。但是,GetMyStrings()需要返回实现IEnumerable的任何内容或从IMyString派生的任何接口的IMyString

考虑:

public interface IMyOtherString : IMyString
{
    int LOL { get; set; }
}

public class AnotherString : MyString, IMyOtherString
{
    public int LOL { get; set; }
}


AnotherString实现IMyString,因此就GetMyStrings()而言,此“应”工作:将采用该参数类型并返回该返回类型。

var foo = new List<AnotherString> {
    new AnotherString { Id = "yes" }, new AnotherString { Id = "no" } };
List<IMyOtherString> result = GetMyStrings("yes", foo);


问题在于GetMyStrings()现在必须要求WithId()返回IEnumerable<IMyOtherString>,但是该返回类型没有WithId()的重载。您定义的WithId()不是一个选项:它可以使用IEnumerable<IMyOtherString>作为参数,但随后会将枚举中的所有内容强制转换为IMyString

peinearydevelopment的答案(选项1是您应该使用的答案;在上述情况下选项2无效)通过将WithId()放在与GetMyStrings()相同的类型参数页上来解决此问题。

这是它的外观。无需返回List<T>。如果需要,调用者可以在其上调用ToList()。

public static IEnumerable<T> WithId<T>(this IEnumerable<T> source, string id)
    where T : IMyString
{
    return source.Where(x => x.Id == id);
}

关于c# - “T”不包含“Foo”的定义,最佳扩展方法重载需要类型为“IType”的接收器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58694628/

10-11 04:07