我有一个带有重载静态方法的C#类,如下所示:
// Added to the Simple class in Tutorial\Extend\csextend.cs
public static int Foo(IEnumerable<int> values)
{
return 1;
}
public static int Foo(IEnumerable<string> values)
{
return 2;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试从IronPython 2.6中调用它们时出错.我正在传递一个包含字符串的python列表.
import clr
clr.AddReferenceToFile("csextend.dll")
import Simple
Simple.Foo(["alpha", "bravo", "charlie"])
Run Code Online (Sandbox Code Playgroud)
TypeError: Multiple targets could match: Foo(IEnumerable[str]), Foo(IEnumerable[ int])
我的第一个问题是为什么这不起作用?似乎重载解决方案应该对此起作用.这是IronPython中的错误吗?什么是最干净的解决方法.我可以重命名例程,这样它们就不会相互重载,但后来我让铁心怪怪改变了C#类的设计.
是否有一种干净的方法可以给python一个线索,即列表完全由一种类型组成,它应该选择一个特定的重载?
与此问题相关
我正在使用短暂的 sqlalchemy 会话将对象添加到 sqlite 数据库。一些对象在会话结束后仍处于只读、分离状态。不幸的是,如果会话已关闭,则访问分离对象的属性会引发异常。这是一个简化的代码示例
from sqlalchemy import Column, String, Integer, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Foo(Base):
__tablename__ = 'foo'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
engine = create_engine('sqlite:///foo.db', echo=False)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
f = Foo(name='foo1')
print('state=transient : name=', f.name)
session.add(f)
print('state=pending : name=', f.name)
session.commit()
session.close()
print('state=detached : name=', f.name)
Run Code Online (Sandbox Code Playgroud)
# output
state=transient : name= foo1
state=pending : name= foo1
Traceback (most recent call last): …
Run Code Online (Sandbox Code Playgroud)