Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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#_Generics - Fatal编程技术网

C# 一般约束

C# 一般约束,c#,generics,C#,Generics,哪个版本更好: using System; namespace Utils.Extensions { public static class EnumerableExtensions { public static bool Between<T>(this T item, T min, T max) where T : IComparable<T> { return item.CompareTo(m

哪个版本更好:

using System;

namespace Utils.Extensions
{
    public static class EnumerableExtensions
    {
        public static bool Between<T>(this T item, T min, T max) where T : IComparable<T>
        {
            return item.CompareTo(min) >= 0 && item.CompareTo(max) <= 0;
        }
    }
}


我认为两者都应该有效,但我应该使用哪一种呢?

我认为第二种更好。对于不可IComparable的类型,它不会使intelliSense建议列表变得混乱。无论如何都不会

而您所寻找的是特定于IComparable的


因此,如果您选择的是可读性,那么使用第二种方法就足够清楚了。

我认为第二种方法更好。对于不可IComparable的类型,它不会使intelliSense建议列表变得混乱。无论如何都不会

而您所寻找的是特定于IComparable的


因此,如果您选择的是可读性,那么使用第二种方法就足够清楚了。

我会说第一种方法,因为它说明了每个T的一些内容,而第二种方法只说明该项应该是可比较的。事实上,它也应该这样做,但是通过你想说的,每个T都是可比的。第一个更好。

我会说第一个,因为它说明了每个T的一些内容,而第二个只说明该项应该是可比较的。事实上,它也应该这样做,但是通过你想说的,每个T都是可比的。第一个更好。

注意,当T是值类型时,使用第二个版本意味着项目将被装箱。向接口强制转换值类型始终需要装箱


一般来说,对于接口,我不会太担心这个问题,但值得注意的是,BCL中几乎每个IComparable实现都是值类型。只有您可以决定是否可以接受较小的装箱开销。

请注意,当T是值类型时,使用第二个版本意味着将装箱该项。向接口强制转换值类型始终需要装箱


一般来说,对于接口,我不会太担心这个问题,但值得注意的是,BCL中几乎每个IComparable实现都是值类型。只有您可以决定是否可以接受较小的装箱开销。

两者之间存在明显差异。第一个用于实现IComparable的类型,第二个用于IComparable

举一个例子:

IComparable<int> x = 14;
bool y = x.Between(12, 23); 
如果您尝试将示例A与第一种技术泛型约束一起使用,那么您将得到一个编译器错误,因为该约束需要实现IComparable的类型,而不是IComparable本身


示例B将使用这两种技术进行编译。我建议使用第二种技术,使其在两种情况下的效果相同。不管怎么说,这似乎是惯例,可能是因为这个原因。但是,还是有其他原因可以避免使用第一个。在您可能希望为特定类型重载方法的情况下,第二种方法为您提供了更大的灵活性。

两者之间有明显的区别。第一个用于实现IComparable的类型,第二个用于IComparable

举一个例子:

IComparable<int> x = 14;
bool y = x.Between(12, 23); 
如果您尝试将示例A与第一种技术泛型约束一起使用,那么您将得到一个编译器错误,因为该约束需要实现IComparable的类型,而不是IComparable本身


示例B将使用这两种技术进行编译。我建议使用第二种技术,使其在两种情况下的效果相同。不管怎么说,这似乎是惯例,可能是因为这个原因。但是,还是有其他原因可以避免使用第一个。在您可能希望为特定类型重载方法的情况下,第二种方法为您提供了更大的灵活性。

更好地定义。更优秀?可读的?还有什么?我想他们的性能差异可以忽略不计。我想的更多的是优雅或可读性。定义得更好。更优秀?可读的?还有什么?我想他们的性能差异可以忽略不计。我想的更多的是优雅或可读性。这是非法的。您的示例是C和Java的非自然混合体。C中没有extends关键字。上面的代码将无法编译。很抱歉,您选择了正确的位置。愚蠢的错误。我应该先检查一下=这个钻头是非法的。您的示例是C和Java的非自然混合体。C中没有extends关键字。上面的代码将无法编译。很抱歉,您选择了正确的位置。愚蠢的错误。我应该先检查一下=这应该没有问题,因为您将T约束为继承IComparable的类型……请注意,第二个版本将导致项被装箱(如果它是值类型),并且框架中几乎每个IComparable都是值类型。这是否真的是OP的问题,由他们来决定。这应该没有问题,因为您将T限制为继承IComparable的类型……请注意,如果是值类型,第二个版本将导致项被装箱,并且框架中几乎每个IComparable都是值类型。是否 他的问题实际上是OP的问题,由他们来决定。
int x = 14;
bool y = x.Between(12, 23);