我知道它有点啰嗦,可能无法完全理解。所以这是我正在尝试做的一个例子。
public class TypeWithString
{
public string MyString { get; set; }
}
string s = "We Want Moshiach Now";
TypeWithString tws = new TypeWithString();
object o = s;
dynamic d = tws;
d.MyString = o;
此代码出人意料地生成错误 RuntimeBinderException: Cannot implicitly convert type 'object' to 'string'
。
尽管 MyString
是 string
类型并且 o
中保存的是 string
。
这是 DLR 中的错误还是缺陷?
有办法解决吗?
如果我提前不知道类型。但我知道它符合鸭子类型。即我知道它实现了一个不成文的接口(interface)。无论如何,当它们确实是正确的类型时,我可以将一个变量分配给另一个变量吗?
非常感谢
最佳答案
不,这是预期的。编译器知道o
的类型是object
,所以它记录了一个动态 Action “尝试找到一个名为MyString
的属性,然后尝试为它分配一个 object
类型的值”——如果存在从 object
到 string
的隐式转换,它可以这样做,但是没有吨。请注意,您的语句中唯一动态的部分是它的目标...因此这是唯一被动态处理的部分。在执行时,“执行时编译器”会有效地说,“d
值的实际类型是什么?啊,它是 TypeWithString...现在,如果我们有会发生什么:
TypeWithString tmpD = (TypeWithString) d;
tmpD.MyObject = o;
... 将会发生编译时错误。
如果您希望它在值中也表现得动态,只需使用 dynamic
而不是 object
作为您分配的值:
string s = "We Want Moshiach Now";
TypeWithString tws = new TypeWithString();
dynamic o = s;
dynamic d = tws;
d.MyString = o;
这一次,“执行时编译器”将询问自己 d
和 o
值的实际类型,想象一下代码如下:
TypeWithString tmpD = (TypeWithString) d;
string tmpO = (string) o; // Actual type is string at execution time
tmpD.MyObject = tmpO;
关于c# - 将对象变量中保存的字符串分配给动态 (C#) 的字符串属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3161631/