Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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# - Fatal编程技术网

C# 类在对象列表中插入

C# 类在对象列表中插入,c#,C#,我有以下方法: void Add<T>(T entity) where T : class; void Add<T>(IEnumerable<T> entities) where T : class; 我得到一个错误,因为它被称为第一个Add方法,而不是第二个Add方法 应该称为第二个,因为MimeTable是一个列表 有没有办法解决这个问题?在这种情况下,第二个Add重载几乎不可能被实际调用。调用它的唯一方法是使用反射,或者使用命名参数(因为参数名称不同)

我有以下方法:

void Add<T>(T entity) where T : class;
void Add<T>(IEnumerable<T> entities) where T : class;
我得到一个错误,因为它被称为第一个Add方法,而不是第二个Add方法

应该称为第二个,因为MimeTable是一个列表


有没有办法解决这个问题?

在这种情况下,第二个
Add
重载几乎不可能被实际调用。调用它的唯一方法是使用反射,或者使用命名参数(因为参数名称不同),这两种方法都不是特别实用的

这是由于过载分辨率的betterness算法。如果重载不需要隐式转换,而另一个重载需要隐式转换,则重载比另一个重载“更好”。一旦推断出泛型参数,您的第一个重载将接受类型为
MimeTable
的参数,该类型正是参数的类型。第二个重载是接受需要隐式转换的
IEnumerable
。这种超负荷将变得“更糟”。在任何情况下,超载都不会“更好”


最方便的选择几乎肯定是在这里使用两种不同的方法,而不是重载单个方法。任何其他区分它们的方法都比键入不同的名称要复杂。

在这种情况下,第二个
Add
重载几乎不可能真正被调用。调用它的唯一方法是使用反射,或者使用命名参数(因为参数名称不同),这两种方法都不是特别实用的

这是由于过载分辨率的betterness算法。如果重载不需要隐式转换,而另一个重载需要隐式转换,则重载比另一个重载“更好”。一旦推断出泛型参数,您的第一个重载将接受类型为
MimeTable
的参数,该类型正是参数的类型。第二个重载是接受需要隐式转换的
IEnumerable
。这种超负荷将变得“更糟”。在任何情况下,超载都不会“更好”


最方便的选择几乎肯定是在这里使用两种不同的方法,而不是重载单个方法。任何其他区分它们的方法都比键入不同的名称要复杂。

在这种情况下,第二个
Add
重载几乎不可能真正被调用。调用它的唯一方法是使用反射,或者使用命名参数(因为参数名称不同),这两种方法都不是特别实用的

这是由于过载分辨率的betterness算法。如果重载不需要隐式转换,而另一个重载需要隐式转换,则重载比另一个重载“更好”。一旦推断出泛型参数,您的第一个重载将接受类型为
MimeTable
的参数,该类型正是参数的类型。第二个重载是接受需要隐式转换的
IEnumerable
。这种超负荷将变得“更糟”。在任何情况下,超载都不会“更好”


最方便的选择几乎肯定是在这里使用两种不同的方法,而不是重载单个方法。任何其他区分它们的方法都比键入不同的名称要复杂。

在这种情况下,第二个
Add
重载几乎不可能真正被调用。调用它的唯一方法是使用反射,或者使用命名参数(因为参数名称不同),这两种方法都不是特别实用的

这是由于过载分辨率的betterness算法。如果重载不需要隐式转换,而另一个重载需要隐式转换,则重载比另一个重载“更好”。一旦推断出泛型参数,您的第一个重载将接受类型为
MimeTable
的参数,该类型正是参数的类型。第二个重载是接受需要隐式转换的
IEnumerable
。这种超负荷将变得“更糟”。在任何情况下,超载都不会“更好”


最方便的选择几乎肯定是在这里使用两种不同的方法,而不是重载单个方法。与键入不同的名称相比,使用任何其他方法来区分它们都需要更多的工作。

正如其他人所说,您可能希望将第二个
Add
方法重命名为
AddRange
或您喜欢的方法。如果出于某种原因,您确实希望在传递列表时实现替代功能,则可以重命名第二个
Add
方法,并在第一个
Add
方法的开头添加一个检查,该检查表示:

if (entity is IList)
{
    AddRange(entity);
    return;
}

正如其他人所说,您可能希望将第二个
Add
方法重命名为
AddRange
或您喜欢的方法。如果出于某种原因,您确实希望在传递列表时实现替代功能,则可以重命名第二个
Add
方法,并在第一个
Add
方法的开头添加一个检查,该检查表示:

if (entity is IList)
{
    AddRange(entity);
    return;
}

正如其他人所说,您可能希望将第二个
Add
方法重命名为
AddRange
或您喜欢的方法。如果出于某种原因,您确实希望在传递列表时实现替代功能,则可以重命名第二个
Add
方法,并在第一个
Add
方法的开头添加一个检查,该检查表示:

if (entity is IList)
{
    AddRange(entity);
    return;
}

正如其他人所说,您可能希望将第二个
Add
方法重命名为
AddRange
或您喜欢的方法。如果出于某种原因你真的想实现alterna
class Mime
{
}

class MimeTable : List<Mime>
{
}

class Widget
{
    public void Add<T>( T entity ) where T:class
    {
        Console.WriteLine("Add/1 overload #1" ) ;
    }
    public void Add<T>( IEnumerable<T> entity ) where T:class
    {
        Console.WriteLine( "Add/2 overload #2" ) ;
    }
}

class Program
{

    static int Main( string[] args )
    {
        MimeTable mt = new MimeTable() ;
        Widget    widget = new Widget() ;

        widget.Add( mt ) ;
        widget.Add( (IEnumerable<Mime>) mt ) ;

        return 0 ;
    }

}   // program
Add/1 overload #1
Add/2 overload #2