Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型扩展方法冲突,尽管类型不同_C#_Generics - Fatal编程技术网

C# 泛型扩展方法冲突,尽管类型不同

C# 泛型扩展方法冲突,尽管类型不同,c#,generics,C#,Generics,假设我们在C#中有以下4个类: 一种类型树的ClassA和ClassB以及Class1和Class2构成另一种类型树 我创建了以下泛型扩展方法,但将泛型类型约束为特定类型: public static class ClassAExtensions { public static T Field<T>(this T opts, string field) where T : ClassA { opts.Field = field; ret

假设我们在C#中有以下4个类:

一种类型树的ClassA和ClassB以及Class1和Class2构成另一种类型树

我创建了以下泛型扩展方法,但将泛型类型约束为特定类型:

public static class ClassAExtensions
{
    public static T Field<T>(this T opts, string field) where T : ClassA
    {
        opts.Field = field;
        return opts;
    }
}
public static class Class1Extensions
{
    public static T Field<T>(this T opts, string field) where T : Class1
    {
        opts.Field = field;
        return opts;
    }
}
但是,编译器返回此错误:

以下方法或属性之间的调用不明确:“ClassAExtensions.Field(T,string)”和“ClassExtensions.Field(T,string)”


这是编译器的错误还是代码的错误?在我看来,编译器应该能够根据类型约束确定使用哪个扩展方法

这个问题已经被问了很多次了。泛型类型约束不是方法签名的一部分

编译器在解析调用时会看到两个相同的候选对象:

ClassAExtensions.Field<T>(this T opts, string field)
Class1Extensions.Field<T>(this T opts, string field)
ClassAExtensions.Field(此选项为字符串字段)
ClassExtensions.Field(此T选项,字符串字段)
它不能在两者之间进行选择,因为两者都同样有效,因此会将调用标记为不明确


现在的问题可能是:这是一个合理的设计吗?嗯,委婉地说,关于这个问题有各种不同的看法。阅读了解更多关于这个主题的信息。

这是对扩展方法的过度使用。扩展方法用于不用作泛型方法的特定类型。如果您确实需要
ClassA
的扩展方法,则应将其声明为
公共静态ClassA字段(此ClassA选项,字符串字段)
class Program
{
    static void Main(string[] args)
    {
        var instanceB = new ClassB();

        instanceB.Field("fed");
    }
}
ClassAExtensions.Field<T>(this T opts, string field)
Class1Extensions.Field<T>(this T opts, string field)