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