相关疑难解决方法(0)

运算符==不能应用于C#中的泛型类型吗?

根据MSDN中==运营商的文档,

对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回true,否则返回false.对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true.对于字符串类型,==比较字符串的值.用户定义的值类型可以重载==运算符(请参阅运算符).用户定义的引用类型也是如此,尽管 默认情况下==的行为与上述预定义和用户定义的引用类型相同.

那么为什么这段代码片段无法编译呢?

bool Compare<T>(T x, T y) { return x == y; }
Run Code Online (Sandbox Code Playgroud)

我得到错误运算符'=='不能应用于'T'和'T'类型的操作数.我想知道为什么,因为据我所知,==运算符是针对所有类型预定义的?

编辑:谢谢大家.起初我没有注意到该声明仅涉及引用类型.我还认为为所有值类型提供了逐位比较,我现在知道这是正确的.

但是,如果我使用引用类型,==操作符是否会使用预定义的引用比较,或者如果类型定义了一个,它是否会使用运算符的重载版本?

编辑2:通过反复试验,我们了解到==操作员在使用不受限制的泛型类型时将使用预定义的参考比较.实际上,编译器将使用它可以为限制类型参数找到的最佳方法,但不会再看了.例如,true即使Test.test<B>(new B(), new B())被调用,下面的代码也会始终打印:

class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T …
Run Code Online (Sandbox Code Playgroud)

c# generics operators equals-operator

309
推荐指数
10
解决办法
10万
查看次数

使用扩展方法检查值是否为0

我有一个看起来像的扩展方法

public static T ThrowIfObjectIsNull<T>(this T argument) where T : class
{
  if (argument == null)
      throw new ArgumentNullException(nameof(argument));

   return argument;
}
Run Code Online (Sandbox Code Playgroud)

这基本上检查传递的对象是否为空.我想要做的是创建另一个扩展方法,int其中传入的值不是0.所以我继续创建:

public static T ThrowIfZero<T>(this T argument) where T : struct
{
   if (argument == 0)
     throw new ArgumentOutOfRangeException("some error here");

   return argument;
}
Run Code Online (Sandbox Code Playgroud)

当然上面没有编译提示错误:

错误CS0019运算符'=='不能应用于'T'和'int'类型的操作数

有人能指出我如何检查参数值是否正确0

c#

22
推荐指数
2
解决办法
1159
查看次数

EF - 不能将运算符'=='应用于'TId'和'TId'类型的操作数

我有这个泛型类,它使用Entity Framework 6.x.

public class GenericRepository<TEntity, TId> where TEntity, class, IIdentifyable<TId>
{
    public virtual TEntity GetById(TId id)
    {
        using (var context = new DbContext())
        {
            var dbSet = context.Set<TEntity>();
            var currentItem = dbSet.FirstOrDefault(x => x.Id == id);
            return currentItem;
        }
    }

    public virtual bool Exists(TId id)
    {
        using (var context = new DbContext())
        {
            var dbSet = context.Set<TEntity>();
            var exists = dbSet.Any(x => x.Id == id);
            return exists ;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些接口:

public interface IIdentifyable : IIdentifyable<int>
{
} …
Run Code Online (Sandbox Code Playgroud)

c# generics entity-framework

12
推荐指数
1
解决办法
906
查看次数