gpt4 book ai didi

c# - 使用 LINQ 的 .Cast() 运算符时,显式/隐式转换运算符失败

转载 作者:IT王子 更新时间:2023-10-29 04:09:31 26 4
gpt4 key购买 nike

我正在尝试使用一个具有显式(但也因隐式而失败)转换运算符的类,该转换运算符在使用 LINQ 的 Cast<T>() 时失败。功能。下面是两个类的定义

public class DatabaseInfoElement : ConfigurationElement
{
[ConfigurationProperty("AllowedServer", IsRequired = true)]
public string AllowedServer { get { return (string)base["AllowedServer"]; } }

[ConfigurationProperty("DatabaseName", IsRequired = true)]
public string DatabaseName { get { return (string)base["DatabaseName"]; } }

[ConfigurationProperty("SqlInstance", IsRequired = true)]
public string SqlInstance { get { return (string)base["SqlInstance"]; } }

public static explicit operator DatabaseInfo(DatabaseInfoElement element)
{
return new DatabaseInfo(element.AllowedServer, element.DatabaseName, element.SqlInstance);
}

}

public class DatabaseInfo
{
public DatabaseInfo(string allowedServer, string sqlInstance, string databaseName)
{
AllowedServer = allowedServer;
SqlInstance = sqlInstance;
DatabaseName = databaseName;
}

public string AllowedServer { get; set; }
public string SqlInstance { get; set; }
public string DatabaseName { get; set; }
}

这是我用来测试它的代码。

//Gets the ConfigurationSection that contains the collection "Databases"
var section = DatabaseInfoConfig.GetSection();

//This line works perfectly.
DatabaseInfo test = (DatabaseInfo)section.Databases[0];

//This line throws a execption
var test2 = new List<DatabaseInfo>(section.Databases.Cast<DatabaseInfo>());

这是我得到的异常

System.InvalidCastException was unhandled by user code  HResult=-2147467262  Message=Unable to cast object of type 'Server.Config.DatabaseInfoElement' to type 'Server.DatabaseInfo'.  Source=System.Core  StackTrace:       at System.Linq.Enumerable.d__b1`1.MoveNext()       at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)       at Sandbox.Main() in E:\Code\Sandbox\Program.cs:line 82  InnerException: 

我在转换过程中做错了什么才能让它按照我想要的方式工作?

最佳答案

当您定义显式/隐式转换运算符时,它们会在编译时绑定(bind)到调用点。这就是第一行起作用的原因:编译器可以计算出所有需要的类型信息,因此它可以用您的自定义显式转换运算符替换默认运算符。

但是,由于 Cast<T>只是执行通用转换,编译器不知道您的运算符,因此会被忽略。结果:无效的转换异常。

您可以通过执行 .Select(x => (DatabaseInfo)x) 来解决这个问题.或者,您可以添加一个名为 ToDatabaseInfo() 的方法,这样您就不会隐藏实际发生的事情。

关于c# - 使用 LINQ 的 .Cast() 运算符时,显式/隐式转换运算符失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13316718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com