相关疑难解决方法(0)

运算符'&'不能应用于'T'和'T'类型的操作数

我的应用程序定义了几个enum包含该[Flags]属性的s .

我想写一个小的实用程序方法来检查是否为这些中enum的任何一个设置了标志,我想出了以下内容.

protected static bool IsFlagSet<T>(ref T value, ref T flags)
{
    return ((value & flags) == flags);
}
Run Code Online (Sandbox Code Playgroud)

但这给了我错误"运算符'&'不能应用于'T'和'T'类型的操作数".

这可以使用吗?

c# generics generic-method

9
推荐指数
3
解决办法
4223
查看次数

如何比较相同但不受约束的泛型类型的两个元素是否相等?

可能重复:
不能将运算符==应用于C#中的泛型类型?

我有以下泛型类,编译器抱怨" Operator '!=' cannot be applied to operands of type 'TValue' and 'TValue'"(见CS0019):

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {
            if (_value != value) // <<-- ERROR
            {
                _value= value;
                OnPropertyChanged("Value");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我限制TValueclass,我可以使用Object.Equals().既然我需要这个结构和类,我会很高兴,如果我可以避免这一点.

所以问题是,如何比较相同但不受约束的泛型类型的两个元素的相等性?

c# generics struct class equals

8
推荐指数
2
解决办法
3514
查看次数

泛型类型与其默认值的比较(没有泛型类约束)会产生编译时错误

我刚遇到这种情况,我认为这是一个使用default关键字的好机会.但它没有编译,我想不出为什么.以下示例说明了我的问题:

public class Test<TDataSource>
{
    public IQueryable<TDataSource> DataSource { get; set; }

    public bool GetOneOrDefaultResult()
    {
        var result = DataSource.SingleOrDefault();
        return result != default(TDataSource);
    }
}
Run Code Online (Sandbox Code Playgroud)

你会在第8行得到一个错误("运算符'=='不能应用于'TDataSource'和'TDataSource'类型的操作数.").我认为使用default关键字将消除引用类型和值类型之间的任何比较问题.

添加将TDataSource限制为引用类型的通用约束使得这段代码可以编译.

有人可以解释为什么编译器不会为我解决这个问题吗?只是不够聪明才能看到这会起作用吗?

这是相关的: 不能将operator ==应用于C#中的泛型类型?

[编辑] SLaks的答案给了我一些灵感,'=='运算符不起作用,但Equals函数应该.

    public class Test<TDataSource>
{
    public IQueryable<TDataSource> DataSource { get; set; }

    public bool GetOneOrDefaultResult()
    {
        var result = DataSource.SingleOrDefault();
        return result.Equals(default(TDataSource));
    }
}
Run Code Online (Sandbox Code Playgroud)

这个编译会正常吗?

.net c# generics .net-3.5

8
推荐指数
1
解决办法
1751
查看次数

将'=='运算符应用于泛型参数

可能重复:
不能将运算符==应用于C#中的泛型类型?

我有一个DatabaseLookup {}类,其中参数T将由类中的查找方法使用.在查找之前,我想知道是否已经查找过T之类的东西

if (T == previousLookupObject) ...
Run Code Online (Sandbox Code Playgroud)

这根本不编译.什么阻止我做这样的简单比较?

.net c# generics

7
推荐指数
2
解决办法
592
查看次数

使用比较运算符,例如“!=”和“==”,并将泛型限制为 C# 中的值

我有以下代码:

class Foo<T> where T : struct
{
    private T t;
    [...]
    public bool Equals(T t) { return this.t == t; }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,出现以下错误:

运算符“==”不能应用于“T”和“T”类型的操作数

为什么做不到呢?如果有约束的话,where T : class它就会起作用。但我需要它是值类型,因为在我的实现中,这个泛型将始终是一个枚举。

我正在做的就是使用Object.Equals()方法来规避这种情况。因为我只是在 T 之间进行比较,它会始终确保正确的行为吗?

c# generics constraints value-type

5
推荐指数
1
解决办法
2435
查看次数

通用函数中的equals()和==

我正在对各种类型的集合操作进行比较.

所以我有一个泛型类

 public class Comparer<T, Tid>
...
     public bool Equals(T x, T y)
       {
          var xid = m_idfunc(x);
           var yid = m_idfunc(y);
           return (Tid)xid == (Tid)yid;
       }
Run Code Online (Sandbox Code Playgroud)

其中m_idfunc是传递给Comparer构造函数的lambda,它是

Func<T,Tid>
Run Code Online (Sandbox Code Playgroud)

我用Tid = string创建了一个比较器.我进入等于函数xid = string1,yid = string2

如果string1和string 2相同("foo"和"foo"说)

xid == yid
Run Code Online (Sandbox Code Playgroud)

产生错误

(Tid)xid == (Tid)yid
Run Code Online (Sandbox Code Playgroud)

也产生错误(它不应该是必要的 - 我只是变得绝望)

继承我的直接窗口 - 暂停返回xid == yid行

yid.GetType() == typeof(string)
true
xid.GetType() == typeof(string)
true
xid==yid
false
(string)xid==(string)yid
true
xid.Equals(yid)
true
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

c# equals

5
推荐指数
1
解决办法
528
查看次数

在Where Linq语句中使用带有泛型类型的==运算符

我正在尝试使用SQLinq库生成SQL查询(作为字符串).代码上下文是一个泛型类,用于创建带有Where子句的查询.

public string Get<TEntity, TId>(TId id)
    where TEntity: IHasAnIdField<TId>
{
    var query = new SQLinq<TEntity>();

    // The following statement does not compile due to error in lambda with "==" operator
    // "Operator '==' cannot be applied to operands of type 'TId' and 'TId'"
    query = query.Where((Expression<Func<TEntity, bool>>)(i => i.Id == id));

    var sql = query.ToSQL().ToQuery();
    return sql;
}
Run Code Online (Sandbox Code Playgroud)

添加一个where TId: class通用的限制可以解决问题,但因为我的TID,在大多数情况下,值类型(主要是int,long,Guid)它不符合我的需求.并且通用约束where TId: struct不会使其编译.我理解为什么会发生这种情况(感谢这个帖子).

实体的接口是 …

c# linq generics lambda operators

5
推荐指数
1
解决办法
1217
查看次数

比较泛型方法中的结构

这是我正在努力解决的简化案例:

public bool CompareStruct<S>(S a, S b) where S : struct
{
  return a == b;
}
Run Code Online (Sandbox Code Playgroud)

以上不会编译错误Operator '==' cannot be applied to operands of type 'S' and 'S'

通常情况下,我不会感到惊讶。但我已经指出那S是一个结构体——那么为什么我不能比较这两个参数呢?

我不认为这个 SO 问题在这里有任何相关性 - 毕竟,我正在使用struct类型,而不是引用类型。

c# generics

5
推荐指数
1
解决办法
2100
查看次数

使用泛型的突破性错误

我正在尝试制作通用Repository pattern基类,其中将实现成员.这是一个代码:

public abstract class RepositoryBase<TEntity, TType> : IRepository<TEntity, TType>
    where TEntity : EntityBase<TType>
{
    public IAdNetMsSqlContext Context { get; set; }
    public DbSet<TEntity> DbSet { get; set; }

    public RepositoryBase(IAdNetMsSqlContext context)
    {
        Context = context;
        DbSet = context.Set<TEntity>();
    }

    public IQueryable<TEntity> Get(TType id)
    {
        //!!! Here is an error
        return DbSet.FirstOrDefault(e => e.Id == id);
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

   Error    1   Operator '==' cannot be applied to operands of type 'TType' and    `'TType' .... AdNet.Common.Base
Run Code Online (Sandbox Code Playgroud)

在线:

   return …
Run Code Online (Sandbox Code Playgroud)

.net c# generics

2
推荐指数
1
解决办法
196
查看次数

运算符'=='不能应用于'Type'类型的操作数 和'类型?'

我有一个这样的课:

public class Article {

private Category? category;
private string content;

public Article(Category? category,string content){
      Contract.Ensures(this.category == category); // error

   }
}
Run Code Online (Sandbox Code Playgroud)

但在Ensure方法上会出现此错误:

运算符'=='不能应用于'类别'类型的操作数 和'类别?'

我怎么能避免这种情况?

.net c# code-contracts

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