C# 我应该使用什么方法定义在IEquatable上创建扩展方法<;T>;

C# 我应该使用什么方法定义在IEquatable上创建扩展方法<;T>;,c#,generics,extension-methods,C#,Generics,Extension Methods,我打算在int上创建一个In扩展方法,当我意识到,如果我使用IEquatable,我将获得所有基元类型的扩展。这是我当前的实现 public static bool In<T>(this T value, params T[] values) where T : IEquatable<T> { return values.Contains(value); } public static bool In(此T值,参数T[]值),其中T:IEquatable { 返

我打算在
int
上创建一个
In
扩展方法,当我意识到,如果我使用IEquatable,我将获得所有基元类型的扩展。这是我当前的实现

public static bool In<T>(this T value, params T[] values) where T : IEquatable<T>
{
    return values.Contains(value);
}
public static bool In(此T值,参数T[]值),其中T:IEquatable
{
返回值。包含(值);
}

如果(i.In(1,3,7))用于int,它就可以正常工作
。这是定义泛型方法的正确方法吗?

不要将
此t值
用作方法参数,而是使用
此IEquatable值
。然后,您不需要对T进行约束,也只为IEquatable定义它。

不要将
此T值
用作方法参数,而是使用
此IEquatable值
。那么你不需要对T进行约束,你也只为i可数定义它。

我觉得你所拥有的是正确的。您是说类型必须为其自己的类型实现
IEquatable

您还可以对其进行扩展,说明您要比较的类型可以是另一种类型,它为
值实现
IEquatable

public static bool In<T, U>(this T value, params U[] values) where U : IEquatable<T>
{
    bool result = false;
    foreach (U instance in values)
    {
        if (instance.Equals(value))
        {
            result = true;
            break;
        }
    }
    return result;
}
public static bool In(此T值,参数U[]值),其中U:i可调
{
布尔结果=假;
foreach(值中的U实例)
{
if(instance.Equals(value))
{
结果=真;
打破
}
}
返回结果;
}

我觉得你所拥有的一切都是对的。您是说类型必须为其自己的类型实现
IEquatable

您还可以对其进行扩展,说明您要比较的类型可以是另一种类型,它为
值实现
IEquatable

public static bool In<T, U>(this T value, params U[] values) where U : IEquatable<T>
{
    bool result = false;
    foreach (U instance in values)
    {
        if (instance.Equals(value))
        {
            result = true;
            break;
        }
    }
    return result;
}
public static bool In(此T值,参数U[]值),其中U:i可调
{
布尔结果=假;
foreach(值中的U实例)
{
if(instance.Equals(value))
{
结果=真;
打破
}
}
返回结果;
}

是的,这是正确的。(不知道还能说些什么。我定义了同样的方法,效果很好,尽管我开始相信我不喜欢它的风格。当然,这是主观的。)

是的,这是正确的。(不知道还能说些什么。我定义了相同的方法,虽然我开始相信我不喜欢它的风格,但效果很好。当然,这是主观的。)

其中t:IEquatable
是a,所以它非常好,而且,是限制使用有限类型集的泛型方法/类/任何东西的首选方法。

其中T:IEquatable
是一个,所以它非常好,而且是限制使用有限类型集的泛型方法/类/任何东西的首选方法。

为什么不直接编写
(new int[]{1,3,7})。包含(i)
@ChristianHayter我相信它读起来更容易
if(今天,在(星期一,星期二))
vs
if(新int[]{星期一,星期二})。包含(今天))
很公平,你的电话。我建议您将
方法体中的
替换为调用
Contains
。这样你就不必再发明轮子了。@Servy不,我不应该——我的答案是用简单的方法达到同样的效果。如果您询问如何使用
StreamReader
解析xml,我将使用linq to xml为您提供解决方案。@lazyberezovsky他没有要求更好的方法来实现该方法,而是询问这种类型的签名是否适合这种方法。你甚至没有解决这个问题。除了回答问题之外,改进实现也可以,但不能代替回答问题。为什么不写
(new int[]{1,3,7})。包含(i)
@ChristianHayter我相信如果(今天)在(星期一,星期二)读起来更容易
if(new int[]{周一,星期二)
vs
如果(new int[]{1,3,7})。包含(今天))
,你的电话。我建议您将
方法体中的
替换为调用
Contains
。这样你就不必再发明轮子了。@Servy不,我不应该——我的答案是用简单的方法达到同样的效果。如果您询问如何使用
StreamReader
解析xml,我将使用linq to xml为您提供解决方案。@lazyberezovsky他没有要求更好的方法来实现该方法,而是询问这种类型的签名是否适合这种方法。你甚至没有解决这个问题。除了回答问题之外,改进实现也可以,但不能代替回答问题。这是值类型的性能问题,因为它会导致装箱。@usr那么,这将对IEquatable的my int(或其他类型满足约束的地方)执行隐式强制转换吗?如果我使用where约束,则会进行编译时检查以确保它满足该约束,但不需要强制转换?强制转换到
IEquatable
首先需要装箱。对于泛型,不需要更改任何类型,因为变量的类型为
T
。它始终是一个完美的类型匹配。@usr是正确的,如果T是值类型,则需要装箱。我想不出一个解决方案来避免这种情况。这是值类型的性能问题,因为它会导致装箱。@usr那么这会对我的int(或其他类型满足约束的任何地方)执行隐式强制转换到IEquatable吗?如果我使用where约束,则会进行编译时检查以确保它满足该约束,但不需要强制转换?强制转换到
IEquatable
首先需要装箱。对于泛型,不需要更改任何类型,因为变量的类型为
T
。它始终是一个完美的类型匹配。@usr是正确的,如果T是值类型,则需要装箱。我想不出一个可以避免这种情况的解决方案。是否有任何框架类型可以实现
IEquatable
,用于任何其他类型的t