Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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# IList<;字符串>;传递给IEnumerable参数_C#_.net_List_Generics_Ienumerable - Fatal编程技术网

C# IList<;字符串>;传递给IEnumerable参数

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)

今天早上我的大脑根本不工作,所以我希望有人能帮我澄清一下

我有一个小助手方法来检查IEnumerable是否为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
vs
ThrowIfNullOrEmpty
您可以使用普通方法,而不是使用您使用的通用方法:

public static void ThrowIfNullOrEmtpy(IEnumerable enumerable, string argName);
泛型是不必要的

其次。这些方法有不同的名称。这可能只是一个打字错误:


ThrowIfNullOrEmtpy
vs
ThrowIfNullOrEmpty

我已经尝试过该代码,如果两种方法都确实是重载,则会(正确地)使用泛型版本

在粘贴的代码中,第一个函数被称为
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,为什么要用两种方法?字符串还实现<