C# IList<;字符串>;传递给IEnumerable参数
今天早上我的大脑根本不工作,所以我希望有人能帮我澄清一下 我有一个小助手方法来检查IEnumerable是否为null或是否没有项C# IList<;字符串>;传递给IEnumerable参数,c#,.net,list,generics,ienumerable,C#,.net,List,Generics,Ienumerable,今天早上我的大脑根本不工作,所以我希望有人能帮我澄清一下 我有一个小助手方法来检查IEnumerable是否为null或是否没有项 public static class ParameterGuard { public static void ThrowIfNullOrEmtpy<T>(T enumerable, string argName) where T : IEnumerable { if (enumerable == null)
public static class ParameterGuard
{
public static void ThrowIfNullOrEmtpy<T>(T enumerable, string argName) where T : IEnumerable
{
if (enumerable == null)
throw new ArgumentNullException(argName);
if (enumerable.HasCountOf(0))
throw new ArgumentException(Resources.ExceptionEnumerableEmpty, argName);
}
public static void ThrowIfNullOrEmpty(string arg, string argName)
{
if (arg == null)
throw new ArgumentNullException(argName);
if (arg.Length == 0)
throw new ArgumentException(Resources.ExceptionStringEmpty, argName);
}
}
例外情况
The best overloaded method match for
ParameterGuard.ThrowIfNullOrEmpty(string, string)' has some invalid arguments
我本以为,当类实现IEnumerable时,这会起作用
如果有人能帮我澄清一下,我将不胜感激。您可以使用普通方法,而不是使用您使用的一般方法:
public static void ThrowIfNullOrEmtpy(IEnumerable enumerable, string argName);
泛型是不必要的
其次。这些方法有不同的名称。这可能只是一个打字错误:
ThrowIfNullOrEmtpy
vsThrowIfNullOrEmpty
您可以使用普通方法,而不是使用您使用的通用方法:
public static void ThrowIfNullOrEmtpy(IEnumerable enumerable, string argName);
泛型是不必要的
其次。这些方法有不同的名称。这可能只是一个打字错误:
ThrowIfNullOrEmtpy
vsThrowIfNullOrEmpty
我已经尝试过该代码,如果两种方法都确实是重载,则会(正确地)使用泛型版本
在粘贴的代码中,第一个函数被称为ThrowIfNullOrEmtpy
,而不是ThrowIfNullOrEmpty
,因此这是一个简单的拼写错误
此LINQPad代码:
void Main()
{
CreateEmail(new EmailOptions());
}
private void CreateEmail(EmailOptions options)
{
ParameterGuard.ThrowIfNullOrEmpty(options.To, "To");
}
public static class ParameterGuard
{
public static void ThrowIfNullOrEmpty<T>(T enumerable, string argName)
where T : IEnumerable
{
Console.Write("Generic Version");
}
public static void ThrowIfNullOrEmpty(string arg, string argName)
{
Console.Write("String Version");
}
}
public class EmailOptions
{
public List<string> To { get; set; }
}
void Main()
{
CreateEmail(新的EmailOptions());
}
私有void CreateEmail(EmailOptions选项)
{
ParameterGuard.ThrowIfNullOrEmpty(options.To,“To”);
}
公共静态类参数保护
{
公共静态void ThrowIfNullOrEmpty(T可枚举,字符串argName)
其中T:IEnumerable
{
控制台。写入(“通用版本”);
}
公共静态void ThrowIfNullOrEmpty(字符串arg,字符串argName)
{
Console.Write(“字符串版本”);
}
}
公共类电子邮件选项
{
要{get;set;}的公共列表
}
返回“Generic Version”我已经尝试了这段代码,如果这两个方法都是重载,那么将(正确地)使用Generic Version 在粘贴的代码中,第一个函数被称为
ThrowIfNullOrEmtpy
,而不是ThrowIfNullOrEmpty
,因此这是一个简单的拼写错误
此LINQPad代码:
void Main()
{
CreateEmail(new EmailOptions());
}
private void CreateEmail(EmailOptions options)
{
ParameterGuard.ThrowIfNullOrEmpty(options.To, "To");
}
public static class ParameterGuard
{
public static void ThrowIfNullOrEmpty<T>(T enumerable, string argName)
where T : IEnumerable
{
Console.Write("Generic Version");
}
public static void ThrowIfNullOrEmpty(string arg, string argName)
{
Console.Write("String Version");
}
}
public class EmailOptions
{
public List<string> To { get; set; }
}
void Main()
{
CreateEmail(新的EmailOptions());
}
私有void CreateEmail(EmailOptions选项)
{
ParameterGuard.ThrowIfNullOrEmpty(options.To,“To”);
}
公共静态类参数保护
{
公共静态void ThrowIfNullOrEmpty(T可枚举,字符串argName)
其中T:IEnumerable
{
控制台。写入(“通用版本”);
}
公共静态void ThrowIfNullOrEmpty(字符串arg,字符串argName)
{
Console.Write(“字符串版本”);
}
}
公共类电子邮件选项
{
要{get;set;}的公共列表
}
返回“通用版本”为什么不试试这个:
public static void ThrowIfNullOrEmpty<T>(IEnumerable<T> enumerable, string argName)
{
...
}
公共静态void ThrowIfNullOrEmpty(IEnumerable可枚举,字符串argName)
{
...
}
如上所述,您的第一个方法名将出现错误。为什么不尝试以下方法:
public static void ThrowIfNullOrEmpty<T>(IEnumerable<T> enumerable, string argName)
{
...
}
公共静态void ThrowIfNullOrEmpty(IEnumerable可枚举,字符串argName)
{
...
}
如上所述,您的第一个方法名会有错误。
string
也实现了IEnumerable
,您只能使用一个方法:
public static class ParameterGuard
{
public static void ThrowIfNullOrEmpty<T>(IEnumerable<T> enumerable, string argName)
{
if (enumerable == null)
throw new ArgumentNullException(argName);
if (!enumerable.Any())
throw new ArgumentException();
}
}
public class Program
{
static void Main(string[] args)
{
List<string> list = new List<string>();
list.Add("test");
ParameterGuard.ThrowIfNullOrEmpty(list, "list");
ParameterGuard.ThrowIfNullOrEmpty("string", "str");
}
}
公共静态类ParameterGuard
{
公共静态void ThrowIfNullOrEmpty(IEnumerable可枚举,字符串argName)
{
if(可枚举==null)
抛出新ArgumentNullException(argName);
如果(!enumerable.Any())
抛出新ArgumentException();
}
}
公共课程
{
静态void Main(字符串[]参数)
{
列表=新列表();
列表。添加(“测试”);
ParameterGuard.ThrowIfNullOrEmpty(列表,“列表”);
ParameterGuard.ThrowIfNullOrEmpty(“string”、“str”);
}
}
string
还实现了IEnumerable
,您只能使用一种方法:
public static class ParameterGuard
{
public static void ThrowIfNullOrEmpty<T>(IEnumerable<T> enumerable, string argName)
{
if (enumerable == null)
throw new ArgumentNullException(argName);
if (!enumerable.Any())
throw new ArgumentException();
}
}
public class Program
{
static void Main(string[] args)
{
List<string> list = new List<string>();
list.Add("test");
ParameterGuard.ThrowIfNullOrEmpty(list, "list");
ParameterGuard.ThrowIfNullOrEmpty("string", "str");
}
}
公共静态类ParameterGuard
{
公共静态void ThrowIfNullOrEmpty(IEnumerable可枚举,字符串argName)
{
if(可枚举==null)
抛出新ArgumentNullException(argName);
如果(!enumerable.Any())
抛出新ArgumentException();
}
}
公共课程
{
静态void Main(字符串[]参数)
{
列表=新列表();
列表。添加(“测试”);
ParameterGuard.ThrowIfNullOrEmpty(列表,“列表”);
ParameterGuard.ThrowIfNullOrEmpty(“string”、“str”);
}
}
按如下方式更改您的方法签名:
public static class ParameterGuard
{
public static void ThrowIfNullOrEmpty(IEnumerable enumerable, string argName)
{
}
public static void ThrowIfNullOrEmpty(string arg, string argName)
{
}
}
您的两种方法有一个小的输入错误,这可能是造成混淆的原因。。通过这种方式,您应该调用具有可枚举项的方法。更改您的方法签名,如下所示:
public static class ParameterGuard
{
public static void ThrowIfNullOrEmpty(IEnumerable enumerable, string argName)
{
}
public static void ThrowIfNullOrEmpty(string arg, string argName)
{
}
}
您的两种方法有一个小的输入错误,这可能是造成混淆的原因。。这样,您应该使用可枚举项调用该方法。如果它是代码的副本/粘贴,可能是因为第一个函数调用的是
ThrowIfNullOrEmtpy
,而不是ThrowIfNullOrEmpty
。您确定吗?我们不能复制这个故事problem@SWeko ; 你说得对。这是个打字错误。是否要创建并回答该点此问题似乎与主题无关,因为它太本地化(有一个不明显的打字错误)。如果它是代码的副本/粘贴,可能是因为第一个函数调用了ThrowIfNullOrEmtpy
,而不是ThrowIfNullOrEmpty
。是否确定?我们不能复制这个故事problem@SWeko ; 你说得对。这是个打字错误。是否创建并回答要点此问题似乎与主题无关,因为它太本地化(有一个不明显的打字错误)我已经如上所述对其进行了更改,但它仍然不能使用相同的代码进行编译exception@PhilMurray您是否尝试修复拼写?我已如上所述对其进行了更改,但仍无法使用相同的格式编译exception@PhilMurray你试着修改拼写了吗?谢谢。。。慢慢地把头撞在桌子上:-)@PhilMurray,为什么要用两种方法?字符串还实现<