运算符 '!=' 不能应用于类型为 'Task' 和 'int' 的操作数

Posted

技术标签:

【中文标题】运算符 \'!=\' 不能应用于类型为 \'Task\' 和 \'int\' 的操作数【英文标题】:Operator '!=' cannot be applied to operands of type 'Task' and 'int'运算符 '!=' 不能应用于类型为 'Task' 和 'int' 的操作数 【发布时间】:2016-07-02 05:03:24 【问题描述】:

最近我开始使用 Xamarin 创建 android 应用程序。我尝试使用 SQLite 创建一个小型本地数据库。我使用了Xamarin documentation website的以下教程。

不幸的是,我收到了一个错误:

错误 CS0019:运算符“!=”不能应用于“任务”和“整数”类型的操作数 (CS0019)

我的代码如下:

private string createDatabase(string path)
    
        try
        
            var connection = new SQLiteAsyncConnection(path);
                connection.CreateTableAsync<Person>();
                return "Database created";
            
        
        catch (SQLiteException ex)
        
            return ex.Message;
        
    

    private string insertUpdateData(Person data, string path)
    
        try
        
            var db = new SQLiteAsyncConnection(path);
            if ( db.InsertAsync(data) != 0)
                db.UpdateAsync(data);
            return "Single data file inserted or updated";
        
        catch (SQLiteException ex)
        
            return ex.Message;
        
    

    private int findNumberRecords(string path)
    
        try
        
            var db = new SQLiteConnection(path);
            // this counts all records in the database, it can be slow depending on the size of the database
            var count = db.ExecuteScalar<int>("SELECT Count(*) FROM Person");

            // for a non-parameterless query
            // var count = db.ExecuteScalar<int>("SELECT Count(*) FROM Person WHERE FirstName="Amy");

            return count;
        
        catch (SQLiteException ex)
        
            return -1;
        
    

Person 类如下:

using System;
using SQLite;

namespace HelloWorld 
public class Person

    [PrimaryKey, AutoIncrement]
    public int ID  get; set; 

    public string FullName  get; set; 

    public string CarLicense  get; set; 

    public override string ToString()
    
        return string.Format("[Person: ID=0, FullName=1, CarLicense=2]", ID, FullName, CarLicense);
    


谁能帮我解决这个错误?

【问题讨论】:

【参考方案1】:

你可以这样做:

if ( (await db.InsertAsync(data)) != 0)

另请参阅this answer,了解为什么await 通常比使用.Result 更受欢迎。

【讨论】:

【参考方案2】:

这告诉您需要比较结果,而不是任务。请更新这一行:

if ( db.InsertAsync(data) != 0)

if ( db.InsertAsync(data).Result != 0)

【讨论】:

谢谢,这是错误。而且我也必须使用await,对吧? 不,因为我相信等待发生在 InsertAsync 中。为此,您需要在自己的异步方法中调用它并等待响应,然后返回 int 进行比较。 这是非常危险的,可能会导致死锁。使用await!【参考方案3】:

您应该等待结果,而不是使用可能导致死锁的Result

if (await db.InsertAsync(data) != 0)

    await db.UpdateAsync(data);

这要求你的方法也是异步的,所以签名应该是:

private async Task<string> insertUpdateData(...)

【讨论】:

@没有编号的用户 - 这应该被标记为下一个有相同问题的开发者的最佳答案。 让OP选择最佳答案@Mr.B【参考方案4】:

您可以使用异步,如果您希望 innsertUpdateData 是异步的,则等待。

private async Task<string> insertUpdateData(Person data, string path)

        try
        
            var db = new SQLiteAsyncConnection(path);
            if ( 0 != await db.InsertAsync(data))
                await db.UpdateAsync(data);
            return "Single data file inserted or updated";
        
        catch (SQLiteException ex)
        
            return ex.Message;
        

【讨论】:

【参考方案5】:

您需要在 db.InsertAsync(data) 上添加 .result

【讨论】:

以上是关于运算符 '!=' 不能应用于类型为 'Task' 和 'int' 的操作数的主要内容,如果未能解决你的问题,请参考以下文章

在swift中连接:二进制运算符'+'不能应用于'String'和'AnyObject'类型的操作数

运算符 '>' 不能应用于类型 'string' 和 'number' 错误

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

二元运算符'+'不能应用于'String'和'() -> String'类型的操作数

运算符'> ='不能应用于'string'和'int'类型的操作数[重复]

无法在 SQL 数据工具脚本中应用相等“运算符 '==' 不能应用于 'bool' 类型的操作数” (FIX)