我的应用程序定义了几个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#中的泛型类型?
我有以下泛型类,编译器抱怨" 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)
如果我限制TValue到class,我可以使用Object.Equals().既然我需要这个结构和类,我会很高兴,如果我可以避免这一点.
所以问题是,如何比较相同但不受约束的泛型类型的两个元素的相等性?
我刚遇到这种情况,我认为这是一个使用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)
这个编译会正常吗?
可能重复:
不能将运算符==应用于C#中的泛型类型?
我有一个DatabaseLookup {}类,其中参数T将由类中的查找方法使用.在查找之前,我想知道是否已经查找过T之类的东西
if (T == previousLookupObject) ...
Run Code Online (Sandbox Code Playgroud)
这根本不编译.什么阻止我做这样的简单比较?
我有以下代码:
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 之间进行比较,它会始终确保正确的行为吗?
我正在对各种类型的集合操作进行比较.
所以我有一个泛型类
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)
这是怎么回事?
我正在尝试使用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不会使其编译.我理解为什么会发生这种情况(感谢这个帖子).
实体的接口是 …
这是我正在努力解决的简化案例:
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类型,而不是引用类型。
我正在尝试制作通用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) 我有一个这样的课:
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方法上会出现此错误:
运算符'=='不能应用于'类别'类型的操作数 和'类别?'
我怎么能避免这种情况?