从一个用户定义类转换到另一个具有返回问题的类。(C#)
我是C#的新手,这没有什么意义。 我正在将一个名为User的非常简单的类转换为另一个名为InputCapsule的相当简单的类。 我遇到的问题是返回输入胶囊的时间,VS表示如下 用户定义的转换必须转换为封闭类型或从封闭类型转换 我很困惑,因为我返回的是正确的类型。 我的参考代码: (如果名称、电子邮件和通行证发生变化,则它们是属性。)从一个用户定义类转换到另一个具有返回问题的类。(C#),c#,casting,C#,Casting,我是C#的新手,这没有什么意义。 我正在将一个名为User的非常简单的类转换为另一个名为InputCapsule的相当简单的类。 我遇到的问题是返回输入胶囊的时间,VS表示如下 用户定义的转换必须转换为封闭类型或从封闭类型转换 我很困惑,因为我返回的是正确的类型。 我的参考代码: (如果名称、电子邮件和通行证发生变化,则它们是属性。) 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 名称
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间你好
{
公共类输入胶囊
{
公共静态显式运算符InputCapsule(用户v)
{
InputCapsule@out=新的InputCapsule();
@out.输入.添加(v.名称);
@输出。输入。添加(v.电子邮件);
@输出.输入.添加(v.通过);
返回@out;
}
公开清单投入;
}
}
转换运算符的源类型或目标类型必须与封闭类/结构的类型相同。这里,封闭类是InputCapsule
。请注意,这是一种开放类型。目标类型为InputCapsule
——一种封闭类型。C#对这些问题的处理非常不同,认为它们是不同的类型,尽管它们都是以InputCapsule
开头的。看
为了证明它们确实是不同的类型,我可以声明从InputCapsule
到InputCapsule
的转换:
公共静态显式运算符InputCapsule(InputCapsule v)
{
返回null;
}
如果它们是同一类型,根据法律,这是不允许的
如果可以更改User
,则应在User
中声明转换。此处用于“强制转换(当前类型)”(如果不存在此表达式,则不可以使用封闭构造的泛型类型作为显式运算符“名称”的泛型类型参数,因为方法定义用于开放类型(对不起,如果我没有用这些好话)
这里您不是在使用泛型“方法”,而是在定义它,因为它接受的参数类型不是InputCapsule
(请参阅@Sweeper-answer,我将其称为“cast out(当前类型)”)
因此,这里的泛型类型参数T
必须与InputCapsule
中的类本身相同
因此,您可以接下来检查T
是否是方法体中的字符串,以允许或禁止(抛出异常)强制转换,或者执行其他相关操作
例如,您可以编写:
public class InputCapsule<T>
{
public static explicit operator InputCapsule<T>(User v)
{
if ( typeof(T) == typeof(string) )
{
InputCapsule<string> instance = new InputCapsule<string>();
instance.inputs.Add(v.Name);
instance.inputs.Add(v.Email);
instance.inputs.Add(v.Pass);
return (InputCapsule<T>)(object)instance;
}
else
throw new InvalidCastException();
}
public List<T> inputs = new List<T>();
}
public class User
{
public string Name;
public string Email;
public string Pass;
}
还使用新的开关模式匹配
试验
您的方法正在转换为
InputCapsule
而不是InputCapsule
。封闭类型是公共类InputCapsule
“我正在返回正确的类型”--不,您没有。错误消息准确地解释了代码的错误。
public static explicit operator InputCapsule<string>(InputCapsule<T> v)
{
return null;
}
public class InputCapsule<T>
{
public static explicit operator InputCapsule<T>(User v)
{
if ( typeof(T) == typeof(string) )
{
InputCapsule<string> instance = new InputCapsule<string>();
instance.inputs.Add(v.Name);
instance.inputs.Add(v.Email);
instance.inputs.Add(v.Pass);
return (InputCapsule<T>)(object)instance;
}
else
throw new InvalidCastException();
}
public List<T> inputs = new List<T>();
}
public class User
{
public string Name;
public string Email;
public string Pass;
}
if ( typeof(T) == typeof(string) )
{
}
else
if ( typeof(T) == typeof(int) )
{
}
else
if ( typeof(T) == typeof(MyClass) )
{
}
else
throw new InvalidCastException();
var user = new User { Name = "name", Email = "mail@mail.com", Pass = "pwd" };
var inputcapsule = (InputCapsule<string>)user;
Console.WriteLine(string.Join(Environment.NewLine, inputcapsule.inputs));